2016-03-20 51 views
0

我有一個要求,其中一個用戶上傳文件到文件收集mongoengine如何複製文件

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

然後,用戶可以提交文件進行驗收的項目。如果該文件被接受,它將被複制並存儲在Project集合中。

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() 

然而,如果用戶決定清理他的上傳文件夾,

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

他是從去除已提交給項目集合文件阻止。避免這種情況的最好方法是什麼?有沒有辦法複製文件,使每個文件與集合中的條目具有1:1的對應關係?然後從集合中刪除文檔也會刪除文件。

回答

0

這是我的解決方案。首先刪除「用戶」和「類型」,並添加「引用」到文件集合。這允許跟蹤對特定文件的所有引用。

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()