Django - 用另一个FileField中的文件替换FileField的文件

时间:2015-07-30 05:25:40

标签: django django-models filefield

我有两个模型都有FileField,如此:

class OriginalFile(models.Model):
    docfile = models.FileField(upload_to=file_path)

class RevisedFile(models.Model):
    newfile = models.FileField(upload_to=revisedfile_path)
    originalfile = models.ForeignKey(OriginalFile, on_delete=models.PROTECT)

如您所见,首次上传文件时,会将其上传到file_path模型中的OriginalFile。但是,如果用户上传了同一文件的修订版,则会将其保存到revisedfile_path模型中的RevisedFile

普通用户没有权利自己修改文件(这就是我当时没有替换原始文件的原因)。如果经理接受修改后的文件,则需要遵循以下事项:

  1. docfile OriginalFile替换为newfile RevisedFile
  2. 删除RevisedFile的相关实例及其目录中保存的newfile
  3. docfilenewfile的名称可以假设相同。我不知道如何处理这个问题。任何形式的帮助都将受到高度赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

删除对您的文件系统的任何用户访问权限。使用FK而不是直接操作文件。不要删除旧文件,而是不显示旧文件。

class DocFile(models.Model):
    file = models.FileField(upload_to=file_path)  # Single path for all doc files

class Document(models.Model):
    # Optional name, description fields 
    approved = models.FK(DocFile)
    revisions = models.ManyToManyField(DocFile)

当普通用户上传文件时,将其添加到Document.revisions,如果是唯一的修订版,则将其设置为已批准。

为经理创建权限组,并允许他们在管理员中编辑文档。通过这种方式,他们可以选择与文档关联的哪个DocFiles是批准的文档。无需传输文件,您不会丢失文件版本,并且文件系统对rm -r是安全的。经理也可以下载文件进行审核