gpt4 book ai didi

python - Django:如何替换/覆盖/更新/更改 FileField 的文件?

转载 作者:太空狗 更新时间:2023-10-29 20:13:09 28 4
gpt4 key购买 nike

在 Django 中,我有以下模型:

from django.db import models
from django.core.files.base import File
import os, os.path

class Project(models.Model):
video = models.FileField(upload_to="media")

def replace_video(self):
"""Convert video to WebM format."""
# This is where the conversion takes place,
# returning a path to the new converted video
# that I wish to override the old one.
video_path = convert_video()

# Replace old video with new one,
# and remove original unconverted video and original copy of new video.
self.video.delete(save=True)
self.video.save(os.path.basename(video_path), File(open(video_path ,"wb")), save=True)
os.remove(video_path)

我希望能够替换模型对象/实例上的 FileField video 中的文件。我写的上述方法不起作用。删除原始文件后,出现以下错误:

ValueError: The 'video' attribute has no file associated with it.

如何用更新的文件替换文件,并删除原始文件(不再需要)?

旁注:我找到了一个 related issue , 但没有令人满意的答案。

最佳答案

你有两个选择。

我假设您的 Project 模型只是一小段代码。

选项 1 是分解您的模型,这样一个项目就没有一个文件,而是一个项目模型与一个项目文件模型相关联。也许一对多。一个项目与多个项目文件一样多。也就是说,ProjectFile 有一个 ForeigKey 到 Project。

然后您可以在旧的项目文件的基础上添加新的项目文件。您可以删除它们,随心所欲地胡闹。实际上,您可以保留两个 ProjectFile 的一个指示器,指示哪个是“当前的”。

选项 2 是 self.video.open("w") 打开文件进行写入。 “就地”改写内容。不是删除和替换文件,而是用新内容重写旧文件。

with open(video_path ,"rb") as source:
self.video.open("wb")
bytes= source.read(4096)
if bytes:
self.video.write( bytes )
bytes= source.read(4096)

这可能会如您所愿。

是的,看起来效率很低。真的没那么糟糕。转换需要永远。复制需要一些时间。

关于python - Django:如何替换/覆盖/更新/更改 FileField 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787141/

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