2013-02-16 61 views
1

我有一個允許對其對象進行評分的模型,並且我希望能夠按最高評分進行過濾,這是一個可以是正整數或負整數的數字範圍:Django按最高評分篩選查詢集

class Thing(models.Model): 
    user = models.ForeignKey(User) 
    created_on = models.DateTimeField(auto_now_add=True) 
    rating = VotingField(can_change_vote=True) 
    .... 

VotingField來自a fork of django-ratings

如何篩選此查詢集到order_by的最高編號rating中的所有Thing對象中?感謝您的想法!

回答

2

我不確定你是否希望最高平均或最高金額,所以你可能需要改變註釋

from django.db.models import Sum, Avg 

Thing.objects.annotate(avg_rating=Avg('rating__score')).order_by('-avg_rating') 
Thing.objects.annotate(sum_rating=Sum('rating__score')).order_by('-sum_rating') 

看到https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate

看起來你在呼喚你的VotingField rating它看起來像它基本上有許多到Vote模型。所以我們希望每個ThingVote集合的score字段的總和或平均值。 (我認爲它的分數場我們想註釋https://github.com/Kronuz/django-ratings/blob/master/djangoratings/models.py#L15但我不使用這個插件,所以做一點研究,如果這不是你所需要的)

+0

謝謝!這是非常豐富的!出於某種原因,'rating_score'工作,而不是'rating__score',所以最後我使用:'Thing.objects.annotate(sum_rating = Sum('rating_score'))。order_by(' - sum_rating')'。謝謝您的意見。它解決了我的問題! – 2013-02-16 22:31:19

+0

我正在嘗試這個解決方案,它似乎工作正常。這是我第二次使用django評分,並試圖通過文檔中解釋的內容來達到此目的,但最終,像第一次一樣,我最終使用了註釋。 @Nick B對rating_score的評價對我來說也是如此,如果沒有,我會得到一個FiledError,我會提醒Django我需要在rating_score和rating_votes之間進行選擇。 – Bastian 2013-05-18 14:51:50