为什么在填充时会扩展ndb.Model子类?

时间:2014-02-24 13:46:52

标签: python google-app-engine app-engine-ndb

我们的模型定义为......

class Foo(ndb.Model): bar = ndb.TextProperty()

如果我创建get Foo的实例并将其命名为foo,则可行...

foo.populate(**{'SPAM': None})

这为foo提供了新的SPAM属性。

我想知道如何在更新不存在的属性时引发异常。我认为这应该是开箱即用的。

对于记录,新属性也是无类型的,因此我可以SPAM5然后"five",没问题。

3 个答案:

答案 0 :(得分:2)

我很确定这是设计的。您可以使用foo对象执行任何操作,就像您可以将整数值分配给bar一样,如果您愿意,甚至可以删除此属性。但是,当存储此值时,它将仅存储模型中定义的属性并具有正确的类型。仅当现有属性的类型或值与其定义不匹配时,才会引发异常。

答案 1 :(得分:2)

运行您发布的代码会引发TypeError,因为populate期望与属性名称匹配的keyword-args而不是dict。致电foo.populate(**{"SPAM": None})foo.populate(SPAM=None)会提出

AttributeError: type object 'Foo' has no attribute 'SPAM'

您确定您的实际代码与您的示例没有什么不同吗? (您的模型可能是Expando子类吗?)

答案 2 :(得分:2)

格雷格说:“你的模型可能是Expando子类吗?”这就是我一开始就问自己的问题,但在实际的代码中ndb.Model是基类我们用于其他一切。

应用程序的User模型实际上来自我们使用的auth库webapp2_extras.appengine.auth.models,它可能使用Expando基类。

我测试了这个以及我们抛出预期异常的所有其他模型。

TL; DR User中的webapp2_extras.appengine.auth.models模型使用Expando基类。没有真正的神秘感。