Mongoengine pre_delete 文件字段
Mongoengine pre_delete FileField
我是 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() 有效。
集合 "test" 中有一个文档引用了 GridFS 中的文件。
fs.files 中有一个文件。
并在 fs.chunks。
现在我运行m.delete()。
集合 "test" 为空。
fs.files 不为空。 fs.chunks 也不是。该文件仍然存在。
根据mongoengine docs for gridfs,我需要运行 m.my_file.delete() 在删除MyFiles 文档之前删除GridFS 条目。如果我像这样把 m.my_file.delete() 放在 m.delete() 之前,我已经确认这是有效的。
m.save()
print(m.my_file.read())
m.my_file.delete()
m.delete()
不过我希望它在 pre_delete 中 运行。这似乎是 pre_delete 的目的。知道我做错了什么吗?
问题来了。我没有注册信号。这有效:
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()
我是 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。
现在我运行m.delete()。
集合 "test" 为空。
fs.files 不为空。 fs.chunks 也不是。该文件仍然存在。
根据mongoengine docs for gridfs,我需要运行 m.my_file.delete() 在删除MyFiles 文档之前删除GridFS 条目。如果我像这样把 m.my_file.delete() 放在 m.delete() 之前,我已经确认这是有效的。
m.save()
print(m.my_file.read())
m.my_file.delete()
m.delete()
不过我希望它在 pre_delete 中 运行。这似乎是 pre_delete 的目的。知道我做错了什么吗?
问题来了。我没有注册信号。这有效:
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()