Mongoengine 预删除文件字段

2024-04-26 12:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉mongoengine。我试图让pre_delete钩子删除存储在GridFS中的FileField。在

我使用的是python2.7.10、mongo3.4和mongoengine0.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()上的断点

在我的.file.read()成功了。在

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

里面有一个文件fs.文件. enter image description here

在fs.块. enter image description here

现在我运行m.delete()。 集合“test”为空。 enter image description here

在fs.文件不是空的。两者都不是fs.块. 文件保留。 enter image description here

根据mongoengine docs for gridfs,我需要运行m.my_文件.删除()在删除MyFiles文档之前删除GridFS项。我已经确认了如果我把m.my_文件.删除()在m.delete()之前。在

^{pr2}$

但是我希望它在pre_delete中运行。这似乎是pre_delete的目的。你知道我做错了什么吗?在


Tags: 文件testimportuuidmydeleteprefs
1条回答
网友
1楼 · 发布于 2024-04-26 12:49:27

问题就在这里。我没有收到信号。这是有效的:

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

相关问题 更多 >