Python AppEngine通过两个属性对查询对象进行排序

时间:2016-06-08 15:07:10

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

我有一个模特

class Neighborhood(model) {
  name = db.StringProperty(required=True)
  city = EncodedProperty(encoder=_get_city_name)
}

我希望检索所有的邻居对象并通过" name"来对它们进行排序。和"城市"属性。最初,我试过

def retrieveAndSort()
  query=Neighborhood.all()
  query.order("name")
  query.order("city")
  return query

但经过一些进一步的研究后,似乎GAE不支持对EncodedProperty对象进行排序。然后,我尝试使用sort()方法检索查询对象后在Python中对数据进行排序,但Query对象没有此方法。最后,我尝试使用sorted()方法使用代码

对Query对象进行排序

neighborhoods = sorted(neighborhoods, key=attrgetter('city', 'name'))

它几乎奏效了。但是,数据似乎有些混乱,我收到了一些输出,如下所示。

Abu Dhabi - Al Maryah Island
Minneapolis - Montrose
Atlanta - Buckhead
Atlanta - Home Park
Atlantic City - Boardwalk
Atlantic City - Marina
...
California - Saint Helena
California - Yountville
New York City - Central Park
Charlotte - South End
Charlotte - Third End
...

我完全不知道为什么会发生这种情况,并希望得到任何可能的帮助。

修改 样本输出更短:

New York City - Meatpacking District
New York City - Brooklyn
New York City - Midtown West

2 个答案:

答案 0 :(得分:0)

我认为您必须获取实体然后对其进行排序。

neighborhoods = Neighborhood.all().fetch(1000)
neighborhoods = sorted(neighborhoods, key=attrgetter('city', 'name'))

答案 1 :(得分:0)

问题被标记为gae-datastore,但“EncodedProperty”不是数据存储区属性类型。 https://cloud.google.com/appengine/docs/python/datastore/typesandpropertyclasses

模型应该是:

class Neighborhood(db.model):
    name = db.StringProperty(required=True)
    city = db.StringProperty(required=True)

然后您的查询功能可能只是:

def retrieveAndSort():
    """
    Returns everything in Neighborhood model alphabetically
    """
    query = db.GqlQuery('SELECT * FROM Neighborhood ORDER BY city DESC')
    for place in query:
        print "{0} - {1}".format(place.city, place.name)