【问题标题】:Mongoengine pre_delete FileFieldMongoengine pre_delete FileField
【发布时间】:2017-01-25 17:04:24
【问题描述】:

我是 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()。 集合“测试”为空。

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

根据mongoengine docs for gridfs,我需要在删除 MyFiles 文档之前运行 m.my_file.delete() 来删除 GridFS 条目。如果我像这样将 m.my_file.delete() 放在 m.delete() 之前,我已经确认这是可行的。

m.save()

print(m.my_file.read())

m.my_file.delete()
m.delete()

但是我希望它在 pre_delete 中运行。这似乎是 pre_delete 的目的。任何想法我做错了什么?

【问题讨论】:

    标签: python mongodb python-2.7 mongoengine


    【解决方案1】:

    这就是问题所在。我没有注册信号。这有效:

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

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 2019-10-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多