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

相关问题