我们的模型定义为......
class Foo(ndb.Model): bar = ndb.TextProperty()
如果我创建get
Foo
的实例并将其命名为foo
,则可行...
foo.populate(**{'SPAM': None})
这为foo
提供了新的SPAM
属性。
我想知道如何在更新不存在的属性时引发异常。我认为这应该是开箱即用的。
对于记录,新属性也是无类型的,因此我可以SPAM
为5
然后"five"
,没问题。
答案 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)
ndb.Model
是基类我们用于其他一切。
应用程序的User
模型实际上来自我们使用的auth库webapp2_extras.appengine.auth.models
,它可能使用Expando
基类。
我测试了这个以及我们抛出预期异常的所有其他模型。
TL; DR User
中的webapp2_extras.appengine.auth.models
模型使用Expando
基类。没有真正的神秘感。