Appengine过滤器不等式和排序失败

时间:2010-04-19 23:26:47

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

我想我在这里忽略了一些简单的东西,我无法想象这是不可能做到的。

我希望按日期时间属性进行过滤,然后按排名整数属性对结果进行排序。当我尝试这样做时:

query.filter("submitted >=" thisweek).order("ranking")

我得到以下内容:

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted

咦?我错过了什么?

感谢。

5 个答案:

答案 0 :(得分:20)

数据存储区无法通过除不等式中使用的属性之外的任何属性来排序包含不等式的查询。

这通常可以通过添加可以使用相等过滤的属性来解决;在这种情况下,可以使用BooleanProperty跟踪实体是否来自当前周,并在每周结束时为所有实体更新它。

答案 1 :(得分:3)

我使用了另一个技巧,这个技巧仅仅是因为我需要我的数据格式(一个dicts列表)。在这种情况下,我运行基于日期时间的查询,从返回的ents创建dicts,然后按数字'counter'属性排序。扭转排序给了我一个降序。请记住,我只在相当小的数据存储区上请求了10个结果。

q = food.Food.all()
q.filter("last_modified <=", now)
q.filter("last_modified >=", hour_ago)

ents = q.fetch(10)

if ents:
  results = [{
    "name": ent.name,
    "counter": ent.counter
    } for ent in ents]

  # reverse list for 'descending' order
  results.sort(reverse=True)

示例结果:

[{'counter': 111L, 'name': u'wasabi'}, {'counter': 51L, 'name': u'honeydew'}, {'counter': 43L, 'name': u'mars bar'}, {'counter': 37L, 'name': u'scallop'}, {'counter': 33L, 'name': u'turnip'}, {'counter': 29L, 'name': u'cornbread'}, {'counter': 16L, 'name': u'mackerel'}, {'counter': 10L, 'name': u'instant coffee'}, {'counter': 3L, 'name': u'brussel sprouts'}, {'counter': 2L, 'name': u'anchovies'}]

答案 2 :(得分:3)

数据存储区对查询有一些限制。一个是不允许将一个属性上的不等式过滤器与另一个属性上的顺序相结合。您可以在此处找到更多限制:

https://cloud.google.com/appengine/docs/python/ndb/queries

答案 3 :(得分:-1)

最简单的方法是拆分查询:

q1 = query.filter("submitted >=" thisweek)
q2 = q1.order("ranking")

答案 4 :(得分:-1)

我不知道从什么时候开始,但是当前的SDK可能会返回微妙的不同错误:

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted

就我而言,我可以解决这个错误:

query.filter("submitted >=" thisweek).order("submitted").order("ranking")

编辑2013-02-08:正如Horselover Fat在评论中提到的,它只是避免了错误。