gpt4 book ai didi

python - csv导入到django模型

转载 作者:太空宇宙 更新时间:2023-11-04 02:38:25 29 4
gpt4 key购买 nike

每次加载数据时,我的 python csv 导入脚本都会在数据库模型中创建一个额外的空条目。我尝试了各种方法,但我仍然得到一个空条目以及从 csv 加载的实际数据。这就是我的脚本。请您的帮助将取得巨大成就。

class CsvUploadView(LoginRequiredMixin, FormView):
form_class = CsvAttendeeForm
template_name = 'attendee/upload_attendee_csv.html'
success_url = reverse_lazy('home')

def post(self, request, *args, **kwargs):

form_class = self.get_form_class()
form = self.get_form(form_class)
file = request.FILES.get('file')
if form.is_valid():
if file:
reader = csv.reader(file, delimiter=',')
next(reader)
attendee_instance = Attendee()
Attendee.objects.bulk_create(
[Attendee(firstname=row[0],
surname=row[1],
email=row[2],
)
for row in reader])

attendee_instance.save()

return self.form_valid(form)

else:
return self.form_invalid(form)

最佳答案

您的问题出在这个(裁剪的)部分:

attendee_instance = Attendee()

Attendee.objects.bulk_create(
[Attendee(firstname=row[0],
surname=row[1],
email=row[2],
)
attendee_instance.save()

对于第一个 attendee_instance,您正在创建一个空白的 Attendee 对象。您稍后使用 attendee_instance.save() 保存此空白对象。

中间的行 - Attendee.objects.bulk_create... - 您将单个项目列表传递给 bulk_create,因此它会在那里创建对象(带有数据)。你不需要两者。

你想要的可能是:

Attendee.objects.create(firstname=row[0],
surname=row[1],
email=row[2],
)

您不需要 bulk_create 除非您要创建多个对象,您可以直接使用 create。类似地,您不需要通过 attendee_instance=Attendee() 创建对象,然后手动更改属性,您可以像上面描述的那样一次完成所有操作。

值得注意的是 caveats on the limitations of bulk create ,特别是如果您不使用 Postgres,并且如果您到了使用 post_savepre_save 信号的地步。 create方法确实触发了那些保存信号,所以只要确保您使用最适合您的用例的方法

关于python - csv导入到django模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47271948/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com