2012-02-25 35 views
0

在Google App Engine中執行查詢以獲取子集排序時,您可以指定多個.order()調用嗎?你可以在GQL中做到這一點,所以我認爲你可以做.order()調用,但它似乎沒有工作。使用Google App Engine的多個.order()調用

q = Score.all() 
q.filter("level = ", level) 
q.order("-score") 
q.order("-submitted") 
scoreList = q.fetch(10) 

這將排序高分等於最近的最高排名。

+1

你能否澄清「它似乎並不奏效。」你期望得到什麼,你會得到什麼? – gae123 2012-02-25 22:24:38

+0

上面的例子被簡化了。除了獲得按'分數'排序的前10個分數的列表,然後按每個'分數'排序內的「已提交」排序。所以,如果有兩個相同的價值分數,最新的將是第一個。如果有100分相同的價值,我會得到10個最新的。這是否有用?如果是的話,我會開始在我的代碼中查看其他地方。 – 2012-02-25 22:35:11

+0

我很確定我一直在我的代碼中做這個預期的結果。我想知道這些索引是不是最新的。在數據存儲中已有數據後,是否添加了相關索引? – gae123 2012-02-25 22:41:30

回答

0

羅傑,試試這個在你的開發環境,看看它的工作原理:

from google.appengine.ext import webapp 
from google.appengine.ext.webapp import util 
from google.appengine.ext import db 


class Score(db.Model): 
    level = db.IntegerProperty() 
    score = db.IntegerProperty() 
    submitted = db.IntegerProperty() 


class MainHandler(webapp.RequestHandler): 
    def get(self): 
     level = 1 
     if Score.all().count() == 0: 
      Score(level = 1, score = 10, submitted = 10).put() 
      Score(level = 1, score = 10, submitted = 11).put() 
      Score(level = 1, score = 10, submitted = 12).put() 
      Score(level = 1, score = 11, submitted = 10).put() 
      Score(level = 1, score = 11, submitted = 20).put() 
      Score(level = 1, score = 12, submitted = 10).put() 

     q = Score.all().filter("level = ", level).order("-score").order("-submitted") 
     score_list = q.fetch(10) 
     self.response.out.write([ 
       (s.level, s.score, s.submitted) for s in score_list ]) 


def main(): 
    application = webapp.WSGIApplication([('/', MainHandler)], 
             debug=True) 
    util.run_wsgi_app(application) 


if __name__ == '__main__': 
    main()