我是mongoengine的新手。我试图获取pre_delete钩子来删除存储在GridFS中的FileField。
我使用的是Python 2.7.10,Mongo 3.4和mongoengine 0.8.7。
这就是我所拥有的。
import uuid
import mongoengine as me
class MyFiles(me.Document):
meta = {"collection": "test"}
guid = me.UUIDField(binary=False, required=True)
my_file = me.FileField()
@classmethod
def pre_delete(cls, sender, document, **kwargs):
document.my_file.delete()
if __name__ == '__main__':
me.connect(db='main', alias='default', host='localhost')
m = MyFiles(guid=uuid.uuid4())
m.my_file.new_file(content_type='text/plain')
m.my_file.write("This is")
m.my_file.write("my file")
m.my_file.write("Hooray!")
m.my_file.close()
m.save()
print(m.my_file.read())
m.delete()
现在我正在使用m.delete()
上的断点进行调试my.file.read()工作。
fs.files不为空。 fs.chunks也不是。该文件仍然存在。
根据mongoengine docs for gridfs,我需要在删除MyFiles文档之前运行m.my_file.delete()来删除GridFS条目。我已经确认这是有效的,如果我在m.delete()之前放m.my_file.delete(),就像这样。
m.save()
print(m.my_file.read())
m.my_file.delete()
m.delete()
但是我希望它在pre_delete中运行。这似乎是pre_delete的目的。我有什么想法吗?
答案 0 :(得分:0)
这是问题所在。我没有注册信号。这有效:
import uuid
import mongoengine as me
class MyFiles(me.Document):
meta = {"collection": "test"}
guid = me.UUIDField(binary=False, required=True)
my_file = me.FileField()
@classmethod
def pre_delete(cls, sender, document, **kwargs):
document.my_file.delete()
me.signals.pre_delete.connect(MyFiles.pre_delete, sender=MyFiles)
if __name__ == '__main__':
me.connect(db='main', alias='default', host='localhost')
m = MyFiles(guid=uuid.uuid4())
m.my_file.new_file(content_type='text/plain')
m.my_file.write("This is")
m.my_file.write("my file")
m.my_file.write("Hooray!")
m.my_file.close()
m.save()
print(m.my_file.read())
m.delete()