gpt4 book ai didi

python - 使用 commit=False 调用 save() 时未调用 Django 的 FileField "upload_to"方法

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:26 25 4
gpt4 key购买 nike

上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库。

这里是一些相关的代码:

模型.py

def file_upload_path(instance, filename):
path = os.path.join('uploaded_files', str(uuid4()))
return path

class UploadedFile(models.Model):
file_object = models.FileField(null=False, blank=False,
upload_to=file_upload_path)

def __unicode__(self):
return self.file_object.name

表单.py

class UploadFileForm(forms.ModelForm):
class Meta:
model = UploadedFile
fields = ['file_object']

views.py

def home(request):
...
if form.is_valid():
new_file = form.save(commit=True)

print new_file
...

此代码打印出我想要的内容,即调用 upload_to 并将文件保存到所述位置后的文件路径(例如“uploaded_files/b992e44e-6403-4c37-82b4-b3c403d07f79”)。

现在,有了这个 views.py,事情发生了变化:

views.py

def home(request):
...
if form.is_valid():
new_file = form.save(commit=False)

print new_file

# new_file_object = FileObject(os.path.abspath(new_file.file_object.url))
# new_file.mime_type = new_file_object.get_mime_type()
...

我得到的不是路径,而是原始文件名(例如“jnes.exe”),因此我无法处理该文件,因此我可以获得它的 MIME 类型,然后更新模型并保存它数据库。

知道我做错了什么吗?谢谢。

我是如何解决的:

我对仍在内存中/临时在磁盘上的文件进行必要的模型编辑,因为 Django 不允许您直接找到 FileField 的位置,直到您实际保存新模型实例。

表单.py

def save(self, commit=True, *args, **kwargs):
new_model = super(UploadFileForm, self).save(commit=False)

file_object = self.cleaned_data['file_object']

file_info = FileObject(file_object)

new_model.mime_type = file_info.get_mime_type()
new_model.sha256 = file_info.get_sha256()
new_model.md5 = file_info.get_md5()

if commit:
new_model.save()

return new_model

我通过从 Django 的 UploadedFile 临时对象中读取数据,在 FileObject 的构造函数中获取哈希和 mime 类型。 (感谢丹尼尔)

最佳答案

docs陈述以下内容

The file is saved as part of saving the model in the database, so the actual file name used on disk cannot be relied on until after the model has been saved.

所以你没有错。它不会存在,直到它被提交。

如果你想在保存之前以某种方式处理文件。当它是一个临时文件时,你会想要访问它。 This answer可以帮助您使用这种访​​问文件的替代方法来获取 mimetype 等。

关于python - 使用 commit=False 调用 save() 时未调用 Django 的 FileField "upload_to"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31765174/

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