我有一个模型条目
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',所以它只能按页面排序而不是整体排序。我的模型目前是如何设置的?
答案 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
而不是现在的另一种方式。然后它就是我上面给出的排序调用。