mongoengine如何复制文件

时间:2016-03-20 20:07:47

标签: copy mongoengine gridfs

我要求用户将文件上传到文件集

class File(Document):
     user = ReferenceField(User)
     file = FileField()
     type = StringField(choices = ('project', 'uploads'))

然后,用户可以提交文件以接受项目。如果文件被接受,则将其复制并存储在项目集合中。

class Project(Document):
     file = ReferenceField(File)

 file = File.objects(id = id)
 copy = File(user = current_user, file = file.file, type = 'project').save()
 Project(file = copy).save()

但是,如果用户决定清除他的Uploads文件夹,

 files = File.objects(user = current_user, type = 'uploads')
 files.delete()

他被阻止删除提交给Project集合的文件。避免这种情况的最佳方法是什么?有没有办法复制文件,这样每个文件与集合中的条目有1:1的对应关系?然后从集合中删除文档也将删除该文件。

1 个答案:

答案 0 :(得分:0)

这是我的解决方案。首先删除“user”和“type”,然后将“references”添加到File集合中。这允许跟踪对特定文件的所有引用。

class File(Document):
     file = FileField()
     references = db.ListField(db.GenericReferenceField())

现在,当用户上传文件时,用户的引用会添加到文件的引用列表中。

file.update(push__references = user)

将文件用于项目时,项目引用将添加到文件的引用列表中。

file.update(push__references = project)

当用户删除文件时,将检查引用列表以查看用户是否是唯一的引用。如果是,则删除该文件,如果有其他引用,则从列表中删除该文件,并且不删除该文件。

if user in file.references:
     if len(file.references) > 1:
          file.update(pull__references = user)
     else:
          file.file.delete()
          file.delete()