2012-01-28 22 views
2

App Engineで簡単にハイスコアサービスを実装したいと思います。Google 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つのモデルのクラスはありますか?例を見つけるのは難しいです。

質問2:HiscoreTablesが各メンバースコアの 'score'プロパティによって確実に注文されるようにする方法はありますか?そして、自動的にリストを例えば100エントリに制限することはできますか?

多くのおかげで、

ルーベン

答えて

2

ListPropertyは無地でシンプルなPythonのオブジェクトのリストです。私はあなたの質問を理解していれば正常に何を記述していることHiscoreTable

スコア内Hiscoresのリスト= db.ListProperty(Hiscore)がありますが、スコアでリストをソートするsortedを使用する必要がありますソートするための

HiscoreTableエンティティを書く前に。それはリストに追加するHiscoreオブジェクトをすべてpicklingし、その後のクエリで同じpickledバージョンを取得するのと同じです。本質的に、それは、以前のHiscoreランキング状態のスナップショットのリストであり、現在の状態ではない。一定の期間、スコアをキャッシュすることを意図している場合、それは機能しますが、代わりにmemcacheの使用を検討することもできます。

代わりに、あなたはこの

scores = db.ListProperty(db.Key) 

を行うと、そのキーでHiscoreのを取得することができ、実際のHiscore実体を参照するためです。再び、sortedを使用してリストをソートすると、HiscoreTableが書き込まれたときにランキングのスナップショットが保存されます。

しかし、あなたが必要とするのは、国ごとに最新のスコア表がある場合、毎回直接Hiscoreモデルに照会する必要があります。

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

これはそれが右に聞こえるCOSが、私は基本的にPHP&MySQLへ戻って執行決定を行った:は、それが属するHiscoreTableへの参照を持っています。簡単なことをするのはあまりにも複雑すぎて、私は不合理な請求についてあまりにも多くの逸話を聞いています。 :\ –

+0

AFAIK、 'db。データストアの場合、ListPropertyにはサポートされているタイプしか含まれていないため、ListProperty(Hiscore) 'は機能しません。http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#ListProperty –

+0

@Peter Knego、ポイントを取った。 – philofinfinitejest

0

それを行うには、2つの方法があります:あなたは、インデックス上の最大数によって制限されている。この場合

scores = db.ListProperty(db.Key) 

  1. HicoreTableHiscoreキーのリストが含まれていますエンティティ:5000

  2. 各私は受け入れるつもり

    class Hiscore(db.Model): 
        hiscoreTable = db. ReferenceProperty(HiscoreTable) 
    
関連する問題