Python AppEngine按引用属性排序

时间:2012-01-02 18:59:15

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

我有一个模型条目

class Entry(db.Model):
    year = db.StringProperty()
    .
    .
    .

并且无论出于何种原因,姓氏字段存储在不同的模型LastName:

class LastName(db.Model):
    entry = db.ReferenceProperty(Entry, collection_name='last_names')
    last_name = db.StringProperty()

如果我使用.order()查询Entry并按年份(或任何其他属性)对其进行排序,我将如何按姓氏对其进行排序?我是python的新手,但是来自Java,我猜想有某种比较器等价;或者我完全错了,还有另一种方法可以做到。我肯定不能在这个时候改变我的模型,虽然这可能是以后的解决方案。有什么建议?

编辑:我目前正在使用偏移对结果进行分页(很快转向游标,但我认为这将是同样的问题)。因此,如果我尝试在数据存储区之外进行排序,我只会对当前集进行排序;第一页可能都是'B',第二页可能有'A',所以它只能按页面排序而不是整体排序。我的模型目前是如何设置的?

1 个答案:

答案 0 :(得分:4)

这里有一些问题。

没有办法在Python或Java中直接在数据存储区API中进行排序 - 毫无疑问,数据存储区是非关系型的,并且不支持这样的间接查找。

如果这只是一对一的直接关系,它为您提供了从Entry实体到LastName实体的访问者,您可以使用标准的Python sort函数对列表进行排序:

entries.sort(key=lambda e: e.last_name.last_name)

(请注意,这会对列表进行排序,但会返回None,所以不要尝试从中分配)。

然而,这不起作用,因为你实际上得到的是一对多的关系:每个条目可能有很多LastNames。该定义实际上认识到这一点:collection_name属性定义了从Entry到LastName的访问者,称为last_names,即复数。

所以你问的问题真的没有意义:你想要排序哪个潜在的LastNames?你当然可以反过来做 - 给出LastNames的查询,按入门年份排序 - 但鉴于你目前的结构,实际上并没有任何办法。

我必须说,虽然我不知道你的其他模特,但我怀疑你实际上错误的方式得到了这种关系:ReferenceProperty应该住在Entry指向LastName而不是现在的另一种方式。然后它就是我上面给出的排序调用。