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