Skip to main content
 首页 » 编程设计

python之csv导入到django模型

2024年10月01日34exmyth

每次加载数据时,我的 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_save 和 pre_save 信号的地步。 create方法确实触发了那些保存信号,所以只要确保您使用最适合您的用例的方法