假设我已经完成了一个查询,然后我想通过引用属性属性对它进行排序 - 我可以在查询结果中临时添加一个字段,并在将其发送到模板之前添加属性进行排序吗?
q = LetterTable.all().order('votes)
但后来我想采用上面的q结果并对LetterTable的一个名为“Person”的属性进行排序。但是,'person'是对PersonTable上的实例的引用,所以我不想要引用对象,我想按person.name排序。我怎么能这样做?
任何?
答案 0 :(得分:1)
你不能,至少不能开箱即用。 GAE文档中有一些描述查询如何工作的页面。本质上,您的实体是按属性索引的,当您运行查询时,它只是查看索引。
在您的情况下,索引包含引用属性,而不是它引用的PersonTable实体,因此索引没有person.name。
在App Engine中执行此操作的适当方法是进行非规范化。这意味着存储您需要的一些数据的额外副本,在这种情况下,您将在LetterTable实体中存储person.name的副本。然后,您可以查询该名称并对其进行排序。
class LetterTable(db.Model):
person = db.ReferenceProperty(Person)
person_name = db.StringProperty()
这种方法肯定有它的缺点,主要是保持数据同步(即,如果一个人改变了他们的名字,你将必须找到所有引用该人的LetterTable实例,并更改所有非规范化名称)。