Google App Engine:实现一系列有序列表

时间:2012-01-28 16:45:15

标签: python google-app-engine

我想在App Engine中快速实现简单的高分服务。以下是两个模型类:

class Hiscore(db.Model):
    time = db.DateTimeProperty()
    playerName = db.StringProperty()
    score = db.IntegerProperty()

class HiscoreTable(db.Model):
    countryCode = db.StringProperty()
    scores = db.ListProperty(???)

问题1 :我究竟如何使用'ListProperty'?很难找到例子。

问题2 :有没有办法确保HiscoreTables按每个成员得分的“得分”属性排序?我可以自动将列表限制为100个条目吗?

非常感谢,

流便

2 个答案:

答案 0 :(得分:2)

ListProperty是一个简单明了的python对象列表。如果我正确理解你的问题你所描述的是HiscoreTable中的Hiscores列表

    得分= db.ListProperty(Hiscore)

对于排序,在编写HiscoreTable实体之前,您必须使用sorted按分数对列表进行排序。它将要做的就是腌制你添加到列表中的任何Hiscore对象,并在后续查询中检索相同的pickle版本。基本上它将是先前Hiscore排名状态的快照列表,而不是当前状态。如果您打算将分数缓存一段时间,那么这样可行 - 但您可以考虑使用memcache。

或者,为了引用实际的Hiscore实体,你可以做到这一点

scores = db.ListProperty(db.Key)

用钥匙取回Hiscore的。再次,您可能希望在编写列表之前使用sorted对列表进行排序,这样可以在写入HiscoreTable时存储排名快照。

但是,如果您需要的是每个国家/地区的最新分数表,那么您每次都必须直接查询Hiscore模型。

query.filter('countryCode =', somecode).order('-score').fetch(limit=100)

答案 1 :(得分:0)

有两种方法可以做到:

  1. HicoreTable包含Hiscore键列表:

    scores = db.ListProperty(db.Key)
    

    在这种情况下,您受限于实体的最大索引数:5000

  2. 每个Hiscore都引用了它所属的HiscoreTable

    class Hiscore(db.Model):
        hiscoreTable = db. ReferenceProperty(HiscoreTable)