我正在使用ndb数据存储区在Google App Engine,Python 2.7,标准环境中工作。我正在对我的一些NDB模型进行一些更新,其中一个更新要求我在我的“餐厅”模型中添加一个新属性(一个浮点数)。在过去,当我需要向模型添加属性时,我总是喜欢NDB如何在定义模型时指定默认值,如下所示:
class Restaurant(ndb.Model):
... some properties ...
resto_fullresyncstamp = ndb.FloatProperty(default=0.0)
我对此默认值的理解是,当从数据存储区中获取实体时,如果给定实体没有resto_fullresyncstamp属性,则会使用默认值将其中一个添加到模型的本地副本。这样,我不必一直检查是否一切都是None,我可以假设该属性在我的代码中总是有一个值。所以我应该可以做这样的事情......
lastsync = ...
resto = Restaurant.query()....get()
if not resto:
logging.warning("Failed to get restauraunt: %s" % username)
self.error(404)
return
if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync:
logging.warning("Requiring client to perform full resynchronization")
self.error(510)
return
...并且期望,即使“resto_fullresyncstamp”是我的模型中的新属性,并且特定的餐厅从未在任何地方明确设置该属性,我仍然会得到一个有效的(0.0)值来进行比较
我实际得到的是此错误消息:
Traceback (most recent call last):
....
File "/base/data/home/apps/s~virt-som/1.406133528491612487/virtsom.py", line 5399, in post
if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync:
AttributeError: 'Restaurant' object has no attribute 'resto_fullresyncstamp'
不应该这样吗?我已经和NDB一起工作了很长时间,而且我之前在我的模型中使用了“默认”参数。我错过了什么吗?
答案 0 :(得分:1)
这不是它的工作方式。
每当您向现有模型添加新属性时,您必须将旧实体再次放入数据存储区以获取该属性。无论默认值是什么,都可以获得它。