且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-02-23 21:53:59

您有两个选择.

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

I'll assume your Project model is only a snippet of code.

选项 1 是分解您的模型,以便 Project 没有单个文件,而是 Project 模型与 ProjectFile 模型相关联.也许一对多.一个项目和多个项目文件一样.也就是说,ProjectFile 有一个 ForeigKey to Project.

Option 1 is to break your model down so that a Project does not have a single file, but rather a Project model is associated with a ProjectFile model. Perhaps one-to-many. One Project as many ProjectFiles. That is, ProjectFile has a ForeigKey to Project.

然后您可以基于旧的 ProjectFile 添加新的 ProjectFile.您可以删除它们,并随心所欲地胡闹.实际上,您可以保留两个 ProjectFile 并带有当前"指示符.

Then you can add new ProjectFile based on an old ProjectFile. You can delete them, and fool around all you want. Indeed, you can keep both ProjectFile's with an indicator of which is "current".

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

Option 2 is to self.video.open("w") to open the file for writing. Rewrite the contents "in place". Instead of deleting and replacing the file, rewrite the old file with the new content.

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)

这可能会满足您的需求.

That will probably do what you want.

是的,它似乎效率低下.这真的没有那么糟糕.转换需要永远.复制需要一些时间.

Yes, it seems inefficient. It's really not that bad. The conversion takes for ever. The copy takes moments.