【问题标题】:Python AppEngine Sort By Referenced PropertyPython AppEngine 按引用属性排序
【发布时间】:2012-01-02 18:59:15
【问题描述】:

我有一个模型条目

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

这里有几个问题。

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

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

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

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

但是,这行不通,因为您实际上在这里得到的是一对多的关系:每个条目可能有多个姓氏。定义实际上承认这一点:collection_name 属性定义了从 Entry 到 LastName 的访问器,称为last_names,即复数。

所以你的问题没有真正的意义:你想对可能的许多 LastNames 中的哪一个进行排序?你当然可以反过来做——给定姓氏的查询,按条目年份排序——但考虑到你当前的结构,实际上没有任何方法可以做到这一点。

我必须说,虽然我不知道你的其他模型,但我怀疑你实际上把这种关系搞错了:ReferenceProperty 可能应该存在于Entry 指向LastName 而不是与现在相反。那么它就是我上面给出的排序调用。

【讨论】:

  • 这是一个非常奇怪的模式(这个术语在 GAE 中使用吗?)。 Entry 类实际上是我需要的所有主要信息所在的地方(不仅仅是 year 属性)。这个应用程序正在进行中,所以当我了解更多关于 GAE 的信息时,我会进行更正。话虽如此,此时我只需要对 last_names 集合中的第一个姓氏进行排序。
  • @Eliezer 哪个是“第一”?除了 key 之外,实体没有自然顺序,这是任意的。无论如何,这几乎肯定不应该是一个单独的属性,而是原始条目上的一个列表属性。
  • 我的意思是它应该从集合中任意提取一个姓氏并对其进行排序。我知道它有点奇怪,但只要它对某些东西进行排序,它拉出的名字并不重要。无论哪种方式,我想我都会将它添加为条目中的列表属性。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多