2016-03-06 79 views
0

我有以下型號:計算領域,以便通過計算字段

class Question(models.Model): 
    Title = models.CharField(max_length=250) 
    User = models.ForeignKey(User) 

    def GetVotes(self): 
     return Vote.objects.filter(Question=self).aggregate(Sum('Vote'))['Vote__sum'] 

class Vote(models.Model): 
    Question = models.ForeignKey(Question) 
    User = models.ForeignKey(User) 
    Vote = models.IntegerField() 

而且這可以從Question模型可以看到我使用自定義的方法來計算票數爲每一個問題。我這樣做是因爲我想將投票與實際問題分開,因此我不想在Question模型以及Vote中保留投票計數器,因爲這將很難在以後保持。

根據良好的設計,可以計算的信息不應該被存儲。

我現在可以找到每個問題的投票就好了,但問題歸結爲order_by。我想得到所有的問題,並通過他們的投票命令他們。據我所知,這是不可能的,因爲order_by()是數據庫級別,我的方法不在數據庫級別。

我想找到一個很好的方式來做到這一點,而不使用ORM以外的其他技術是可能的嗎?

編輯:
看起來好像沒有好的方法使用ORM,所以我已經實現了使用sorted

+0

我瘦註釋應該做你想做的,看到這樣的回答:http://stackoverflow.com/questions/2501149/order-by-count-of-a-foreignkey-field?rq=1 –

+0

謝謝您的評論@ ger.s.brett。在問這個問題之前,我遇到了這個解決方案,但是我發現這個解決方案唯一的困難是在兩個模型之間應該有一個「連接」,以便我能夠實現這一點。 – Rafael

回答

1

由於order_by應用於數據庫級別,因此無法做到這一點。

但是,你有兩個選擇:

  1. 創建一個字段來存儲計算值並覆蓋寫入方法,這樣就可以計算出的值有
  2. 排序的查詢集如本answer
+0

謝謝你的回答。我正在考慮一個'view'表,而不是將數據存儲在'Question'模型中,但我不確定Django是否可以實現。 – Rafael

1

您可以對正在查找的數據進行註釋,然後按該值進行排序。

Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')