0
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

4

1 回答 1

0

m2(嵌入式文档)确实有一种save方法。它调用m1.save(). 见代码

调用 m1.save() 将对所有嵌入文档调用 save()的假设是错误的。(我掉进了同一个陷阱……)

所以不幸的是,您不能安全地覆盖嵌入文档的保存方法,期望每次保存文档时都会调用它。

但是您可以将其添加为pre_save您调用的方法m1.save()(或在回调中捕获文档中的pre_save 信号)。

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

于 2016-06-20T17:03:52.097 回答