我有一个 Model UnitPattern,它引用另一个 Model UnitPatternSet
e.g.
class UnitPattern(db.Model):
unit_pattern_set = db.ReferenceProperty(UnitPatternSet)
在我看来,我想显示所有unit_pattern_set引用为None的UnitPatterns,但是查询UnitPattern.all().filter("unit_pattern_set =", None)什么也不返回,尽管我总共有5个UnitPatterns,其中2个有'unit_pattern_set'设置而 3 没有
e.g.
print 'Total',UnitPattern.all().count()
print 'ref set',UnitPattern.all().filter("unit_pattern_set !=", None).count()
print 'ref not set',UnitPattern.all().filter("unit_pattern_set =", None).count()
outputs:
Total 5
ref set 2
ref not set 0
查询 2 和 3 的总和不应该等于查询 1 吗?
原因似乎是我后来添加了引用属性unit_pattern_set,并且这些UnitPattern对象在此之前就已经存在,但是如何过滤这些实体呢?
这在docs:
索引仅包含以下实体
拥有所提到的所有财产
指数。如果一个实体没有
索引引用的属性,
实体不会出现在索引中,
并且永远不会成为
使用索引的查询。
注意
App Engine 数据存储区使
实体之间的区别
不拥有财产和
拥有财产的实体
具有空值(无)。如果你想
每个实体都是一个
查询的潜在结果,您可以
使用分配一个数据模型
默认值(例如 None)为
查询过滤器使用的属性。
就您而言,您有 3 个实体没有unit_pattern_set
根本没有设置属性(因为在创建这些实体时模型中没有定义该属性) - 因此这些属性不存在于该实体的数据库表示中,因此该实体不会出现在该实体的索引中此类实体的财产。
丹·桑德森的书谷歌应用程序引擎编程在第 150 页上对此进行了详细解释(不幸的是,在 Google 图书预览中不可用)
要修复您已有的模型,您必须迭代 UnitPattern 上的查询(我尚未测试以下代码,请在对实时数据运行之前检查它):
patterns = UnitPattern.all()
for pattern in patterns:
if not pattern.unit_pattern_set:
pattern.unit_pattern_set = None
pattern.put()
编辑:此外,更新模型的架构本文讨论了将来可用于处理此类架构更改的策略。然而,那篇文章相当老了,它的方法需要网络浏览器不断点击 URL 来触发下一个作业来更新更多记录 - 现在任务队列如果存在,您可以使用一系列任务来进行更改。这关于使用 deferred.defer 的文章有一个您可以利用的框架 - 它执行少量工作,捕获 DeadlineExceededError,并使用处理程序对新任务进行排队,该新任务将在当前任务停止的地方继续执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)