我要求用户将文件上传到文件集
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的对应关系?然后从集合中删除文档也将删除该文件。
答案 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()