如何在mongoengine.EmbeddedDocument类中调用save方法

时间:2016-06-05 12:27:02

标签: mongodb pymongo mongoengine flask-mongoengine

import mongoengine

class Model1(mongoengine.DynamicDocument):
    name = mongoengine.StringField()
    addr = mongoengine.EmbeddedDocumentField(Model2)

class Model2(mongoengine.EmbeddedDocument):
    loc =  mongoengine.StringField()
    # do some stuff
    def save(self, *args, **kwargs):
        print "test line print...."
        super(Model2, self).save(*args, **kwargs)

现在我保存Model1个实例。它不会调用保存方法

m2 = Model2(loc='some text')
m1 = Model1(name='name')
m1.addr = m2
m1.save()

如果我试图明确地在Model2上调用save方法,它会抱怨NoneType object has no attr save

1 个答案:

答案 0 :(得分:0)

m2(嵌入式文档)确实有save方法。它调用m1.save()。请参阅the code

调用m1.save()的假设将在所有嵌入文档上调用save()为false。 (我陷入同样的​​陷阱......)

很遗憾,您不能安全地覆盖嵌入式文档的保存方法,期望每次保存文档时都要调用它。

但是您可以添加一个pre_save方法,从m1.save()(或在回调中捕捉文档中的pre_save signal)。

但是,调用m2.save()应调用m1.save()并保存整个文档。我无法解释这个错误:NoneType object has no attr save。您应该编辑您的问题以提供完整的追溯。