Mongoengine pre_delete FileField

时间:2017-01-25 17:04:24

标签: python mongodb python-2.7 mongoengine

我是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()工作。

enter image description here 集合“test”中有一个文档引用GridFS中的文件。 enter image description here

fs.files中有一个文件。 enter image description here

在fs.chunks中。 enter image description here

现在我运行了m.delete()。 集合“测试”是空的。 enter image description here

fs.files不为空。 fs.chunks也不是。该文件仍然存在。 enter image description here

根据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的目的。我有什么想法吗?

1 个答案:

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