我想知道在创建实例,实例更新时,还是仅在尝试读取值时应用默认值。我想了解这是如何适用于查询的。
例如,假设我最初创建的模型没有默认值
class Foo (db.Model):
bar = db.BooleanProperty()
然后我创建并put
Foo的几个实例。
然后我更新模型
class Foo (db.Model):
bar = db.BooleanProperty(default=False)
然后我有一个查询
foos = Foo.all().filter('bar =', False)
结果是否包含在将默认值添加到模型定义之前创建的Foo实例?
如果我改为查询
foos = Foo.all().filter('bar !=', True)
这是否包括在将默认值添加到模型定义之前创建的Foo实例?是(在布尔属性的情况下)和wrt默认值与前一个查询有什么不同?
我找了关于此的文档,但没有找到,抱歉。希望我只是想念他们。如果可能,请提供GAE文档的链接。
更新: 我在文档中找到了这个
忽略查询中指定的属性的实体
同类实体不需要具有相同的属性。要符合查询结果的条件,实体必须拥有查询过滤器和排序顺序中命名的每个属性的值(可能为null)。如果不是,则从用于执行查询的索引中省略该实体,因此不会将其包括在查询的结果中。
注意:无法查询特定缺少给定属性的实体。另一种方法是定义一个默认值为None的固定(建模)属性,然后过滤为None的实体作为该属性的值。
https://cloud.google.com/appengine/docs/python/datastore/queries
假设在实体创建或更新时应用默认值,我认为这意味着上述两个查询都不会返回在将默认值添加到模型之前最后放置的实体。是吗?
感谢
答案 0 :(得分:4)
这取决于。如果你真的把一个" bar"在你的foo之前是否有默认值。
1-如果你从未设置过bar,只需" put" foos,然后是的,你在添加默认值之前放的任何东西都没有" bar"。
2-如果您在创建它们时实际上为您的foos设置了条形图,那么您的查询将返回所有内容。
你提出问题的方式让我相信你已经设置了#1,所以不,你在数据存储区中放置的任何东西都不会返回默认值。您需要浏览整个数据存储区并更新您的foos。
虽然不在官方文档中,但Alex Martelli(谷歌搜索者)的评论已对此进行了验证
答案 1 :(得分:1)
默认值仅在实体创建时保持不变时分配。更新将保留原始值。
此默认值不会以任何方式影响查询,在保存实体时会写入索引,因此您需要使用正确的值再次编写实体。