2013-09-30 24 views
1

我有以下型號訂貨模型中的行使用自定義趨勢算法,而不是示範場

class Dishes(models.Model): 
    name = models.CharField(max_length=40, unique=True) 
    date_added = models.DateTimeField(auto_now_add=True) 
    #increment/decrement with upvote added or removed 
    count_votes = models.IntegerField(blank=True, null=True, default=0) 

class Upvotes(models.Model): 
    dish = models.ForeignKey(Dishes) 
    user = models.ForeignKey(User) 
    date_added = models.DateTimeField(auto_now_add=True) 

我有3個種類的菜餚,第2是由DATE_ADDED & count_votes,這是容易的菜餚來實現。 order_by(' - count_votes')和dishes.order_by(' - date_added'),第三類是一種「趨勢排序」,我基本上希望能夠隨着時間的推移將排列順序排列爲upvotes的函數,任何想法可以這樣做嗎?

+0

它可以不是'Dishes.objects.order_by('upvotes')'和Upvotes',指定'class Meta:ordering =('date_added',)' – karthikr

+0

這還只是按upvotes的總數降序排列。這個想法應該是,在最後一小時內有10張選票和10張總票數的東西會比在過去一小時內有兩個upvotes並且總共有100個upvotes的東西在「趨勢排序」中更高 –

回答

1

聽起來像你正在尋找實施「趨勢」算法。

關於這個問題有很多文章,你不是第一個問這個問題。檢查出thisthis,並初步研究使用一些預建包,我發現django-trendingdjango-voting這可能對您有所幫助。

編輯

Django中實現複雜的排序,通過使用註釋,但僅限於內置聚合函數,如AVG,SUM等(你可以閱讀有關如何here)。所以沒有django特定的方式來使用自定義方法進行排序。

然而,這並不意味着你不能使用Python做到這一點:

sorted(Dishes.objects.all(), key=lambda x: x.trending_method()) 

我不能說這將如何與大型數據庫的票價,但是這是我知道其他的唯一途徑比使用原始SQL(這也是一個可選的,雖然令人厭煩的解決方案)。希望有所幫助!

+0

實際上並不是算法因爲我不知道如何在Django模型中實現它。我正在使用Hackernews算法((p-1)/(t + 2)^ 1.8)的變體,其中p是upvotes,t是以小時爲單位的年齡,我通常可以在SQL中執行此操作,但我不瞭解如何在我的django模型中實現它 –

+0

順便說一句,我知道關於Django趨勢和Django的投票,我寧願在我的模型中自己實現我的趨勢算法 –

+0

因此,如果我正確理解你,你已經有了一個方法,你只是想根據它進行排序,對吧? – yuvi

相關問題