2016-03-20 3 views
0

У меня есть требование, где а добавления пользовательских файлов в коллекции файловmongoengine как скопировать файл

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

Однако, если пользователь решит очистить свою папку загрузок,

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