【问题标题】:When saving many uploaded files to db save() method only really works for the last file in the query将许多上传的文件保存到 db save() 方法时,仅对查询中的最后一个文件有效
【发布时间】:2019-07-14 21:48:01
【问题描述】:

我正在使用 CreateView 并且在模板中,我正在上传多个文件以存储在数据库中。我从files = self.request.FILES.getlist('file') 的请求中获取所有文件并循环它为每个文件创建一个对象。但是,对象创建仅适用于列表中的最后一个对象。

def form_valid(self, form):
    files = self.request.FILES.getlist('file')
    allowed_file_extensions = ['xls', 'xlsx', 'doc', 'docx', 'pdf']
    for file in files:
        file_converted_to_string = str(file)
        file_regex = re.search(r"([a-zA-Z0-9-_\s]+)[.](\w+?)$", file_converted_to_string)
        file_name, file_extension = file_regex.group(1), file_regex.group(2)
        if file_extension in allowed_file_extensions:
            self.object = form.save(commit=False)
            self.object.file = file
            self.object.file_name = file_name
            self.object.file_extension = file_extension
            self.object.department_belonged = self.request.user.profile.department
            print(self.request.user.profile.department)
            self.object.creator = self.request.user
            self.object.save()
    return super().form_valid(form)

更有趣的是,当我替换时:

self.object = form.save(commit=False)
self.object.file = file
self.object.file_name = file_name
self.object.file_extension = file_extension
self.object.department_belonged = self.request.user.profile.department
self.object.creator = self.request.user
self.object.save()

与:

self.model.objects.create(file=file,
                          file_name=file_name,
                          file_extension=file_extension,
                          department_belonged=self.request.user.profile.department,
                          creator=self.request.user)

它为列表中的每个文件创建一个新对象,但在 models.py 中的 upload_to 函数中引发错误。

file = models.FileField(upload_to=file_path)

def file_path(instance, filename):
    return f'{instance.creator.profile.department}/user_{instance.creator.id}/{filename}'

错误:

异常值:“NoneType”对象没有属性“profile”

【问题讨论】:

    标签: django python-3.x django-views


    【解决方案1】:

    在第一个示例中,您继续对每个文件对象使用self.object。这将在每次保存时继续覆盖相同的对象。因此,在每次保存时,您都会更新现有的数据库行。

    对于使用self.model.objects.create(file=file,.... 的方法,在保存实例之前没有与实例关联的creator,并且由于此方法绕过使用对象(从内存中),因此它不起作用。我建议尝试:

    obj = self.model(
        file=file,
        file_name=file_name,
        file_extension=file_extension,
        department_belonged=self.request.user.profile.department,
        creator=self.request.user
    )
    obj.save()
    

    这是在调用 file_path 之前将创建并允许引用的对象。

    【讨论】:

    • 这并没有解决问题。它成功保存了实例,但在用户端抛出了同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2013-12-29
    • 1970-01-01
    • 2021-09-29
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多