如何过滤具有完全相同重复属性的NDB实体?

时间:2015-06-22 14:10:45

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我的NDB模型类有重复的属性:

class Something(ndb.Model):
  tags = ndb.StringProperty(repeated=True)

有没有办法查询tags等于['music', 'cinema']的所有实体?即返回的每个实体应同时包含musiccinema标记,并且不应包含其他tagsThe GAE doc

  

您无法将重复的属性与列表对象(数据存储区)进行比较   不会理解的。)

我是否必须使用一个标签获取所有实体,然后手动过滤它?

2 个答案:

答案 0 :(得分:1)

存储列表的序列化/哈希版本并查询与之完全匹配的内容可能比获取所有实体更有效:

class Something(ndb.Model):
  tags = ndb.StringProperty(repeated=True)
  tagset = ndb.ComputedProperty(lambda self: ','.join(self.tags.sort()))

然后查询在搜索标签上使用相同的序列化:

    q = Something.query(cls.tagset == ','.join(sorted(['music', 'cinema'])))

答案 1 :(得分:-1)

是的,您可以使用IN属性,该属性在Querying for Repeated Properties时使用列表对象:

Something.tags.IN(['music', 'cinema'])

要查看是否存在两个标记,您可以使用AND操作:

Something.tags.query(ndb.AND(Something.tags == 'music',
                             Something.tags == 'cinema'))