6

如何在设置实体后测试 NDB 中未设置的重复属性?

我能找到的唯一参考说:

在重复属性上查询 None 值具有未定义的行为;不要那样做。

4

1 回答 1

9

如果您从未在重复属性的列表内容中添加任何内容,则不会发送任何值,并且该属性将显示为<missing>not as<null>

根据关于查询和索引的 App Engine 文档,属性没有值的实体和属性值为空的实体之间存在区别;和

查询永远不会返回没有过滤属性的实体。

所以不可能为这些旧记录编写查询。

请参阅 AppEngine 上面引用的其余答案
:Query datastore for records with <missing> value

如果您希望能够查询此类内容,则应在数据模型中强制执行此操作。例如,您可以有ndb.ComputedProperty一个布尔值,对应于相应列表的长度是否为零,例如

class MyModel(ndb.Model):
  my_repeat = ndb.StringProperty(repeated=True)
  sentinel = ndb.ComputedProperty(lambda self: len(self.my_repeat) == 0)

并查询这些缺失值,您可以使用

MyModel.query(MyModel.sentinel == True)

如果您的数据存储中有一组现有的此类对象,您可以对它们运行一次mapreduce,并使用更新的模型定义简单地检索每个实体,然后将每个实体放回数据存储中。这将保持所有现有属性相同并使用sentinel值进行更新。

于 2012-12-18T17:06:20.860 回答