查询AppEngine中模型的list属性中存在的值

时间:2010-08-11 03:33:36

标签: google-app-engine bigtable

样本模型:

  class Foo(db.Model):
     id = db.IntegerProperty()
     bar = db.ListProperty(int, required=True)
  1. 如何使用Query或GqlQuery查询返回 bar 属性中具有给定值的所有 Foo 实体?

  2. 如果我有一个ID列表,是否有一个过滤器会返回 id 属性在该列表中的所有实体?

3 个答案:

答案 0 :(得分:7)

1

如果在list属性上使用equals查询,它将检查列表中的所有项目:

search = 2
results = Foo.all().filter('bar =', search).fetch()

2

您可以使用IN过滤器,但请注意,在内部这会对列表中的每个项目进行数据存储查询,因此可能很慢,并且每个请求最多也有30个内部查询。

items = [1, 2, 3]
results = Foo.all().filter("id IN", items).fetch()

有关1和2的详细信息,请参阅Introducing Queries,有关1的详细信息,请参见ListProperty

答案 1 :(得分:2)

对于那些像我这样无法得到上述答案的人。

使用gae版本1.5.3

results = Foo.all().filter('bar =', search).fetch()

没有结果。但

results = Foo.all().filter('bar =', search).fetch(100)
results = Foo.all().filter('bar =', search)

给出了结果。

答案 2 :(得分:0)

另外你也可以使用Gql ..这可能是自提出问题以来发生的事情

问题1

wheres = 2
pageSize = 10
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar = :1", wheres)
Foos = qry.fetch(pageSize)

问题2

wheres = [ 1, 3, 44, 101 ]
pagesize = 10
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar IN (:1)", wheres)
Foos = qry.Fetch(pageSize)

但请注意in in query。它实际上将执行N个子查询(IN子句中的每个元素都有一个子查询)。这是Gql文档:https://developers.google.com/appengine/docs/python/datastore/gqlreference