0

我正在實施基於某個排名算法的「熱門」故事的首頁。然而,我不知道如何傳遞Appengine的數據存儲我自己的排序功能(就像我可以在Python中排序(key = ranking_function))。我想是這樣的:我可以使Appengine模型屬性調用一個函數嗎?

class Story(db.Model): 
    user = db.ReferenceProperty(User) 
    text = db.TextProperty() 
    def ranking(self): 
     # my ranking function, returns an int or something 
     return 1 
    ranking = property(ranking_function) 

這樣我可以稍後致電:

Story.all().order("ranking").limit(50) 

不知道如何使用AppEngine上的數據存儲模型來做到這一點?

回答

1

沒有內置的屬性來處理這個問題,但是有一個庫,aetycoon,它實現了DerivedProperty和其他相關的屬性來執行你想要的。 Here's關於它如何工作的文章。

+0

我這樣做,它奇妙地工作。但是,當我嘗試使用一些DerivedProperties創建新對象時,我添加了很多似乎會拋出NotSavedErrors的屬性。唯一的解決辦法是將整個事情包裝在一個嘗試除外。它可以工作,但有點難看。 謝謝! – 2010-02-26 00:27:39

+0

你能更具體嗎?你會得到什麼stacktrace,以及在什麼情況下? – 2010-02-26 13:34:09

3

我不認爲這是可能的,你用App Engine描述它的方式,但我認爲這是可以實現你想要的。您希望數據存儲每次執行查詢時都針對數據存儲中的每個元素運行排名功能。這不是非常可擴展的,因爲你可能擁有數百萬個你想要排名的實體。

相反,您應該只有一個名爲rank的整數屬性,並在每次更新實體時都設置它。然後,您可以在訂單條款中使用該屬性。

+0

謝謝。然而,看到一個真正有用的漂亮圖書館的接受答案! – 2010-02-26 00:28:32

相關問題