0

假设我已经完成了一个查询,然后我想通过引用属性属性对其进行排序 - 我可以在查询结果中临时添加一个字段并添加属性以在将其发送到模板之前对其进行排序吗?

q = LetterTable.all().order('votes) 

但随后我想获取上面的 q 结果,并对 LetterTable 的一个名为“Person”的属性进行排序。但是,'person' 是对 PersonTable 上的实例的引用,所以我不想要引用对象,我想按 person.name 排序。我怎样才能做到这一点?

任何人?

4

1 回答 1

1

你不能,至少不能直接开箱即用。GAE 文档中有一些页面描述了查询的工作方式。本质上,您的实体是按属性索引的,当您运行查询时,它只是查看索引。

在您的情况下,索引包含引用属性而不是它引用的 PersonTable 实体,因此索引没有 person.name。

在 App Engine 中执行此操作的适当方法是非规范化。这意味着存储您需要的一些数据的额外副本,在这种情况下,您将在 LetterTable 实体中存储 person.name 的副本。然后您可以对该名称进行查询和排序。

class LetterTable(db.Model):
    person = db.ReferenceProperty(Person)
    person_name = db.StringProperty()

这种方法当然有它的缺点,主要是保持数据同步(即,如果一个人更改了他们的名字,您必须找到所有引用该人的 LetterTable 实例,并更改所有非规范化的名称)。

于 2013-08-07T01:41:25.463 回答