2010-12-18 37 views
0

我正在構建一個有問題的簡單應用程序。每個問題都會有一個二元投票(是/否)。我想記錄每個用戶的投票,所以每個用戶每個問題只能得到一個投票(類似於堆棧溢出或reddit)。從模型保存方法操作另一個模型的數據

我在這個問題上有一個vote_no和votes_yes int字段。每次添加投票時,這些都需要在交易中更新。我可以從Vote模型的保存方法中做到這一點嗎?

class Question(models.Model): 
    part_isit = models.CharField(max_length=45) 
    part_if = models.CharField(max_length=90) 
    votes_no = models.IntegerField() 
    votes_yes = models.IntegerField() 
    author = models.ForeignKey(User) 
    create_date = models.DateField(auto_now_add=True) 

VOTE_CHOICES = (
    ('Y', 'Yes'), 
    ('N', 'No'), 
) 

class Vote(models.Model): 
    choice = models.CharField(max_length=1, choices=VOTE_CHOICES) 
    question = models.ForeignKey(Question) 
    author = models.ForeignKey(User) 
    create_date = models.DateField(auto_now_add=True) 
    def save(self): 
     # increment the questions vote totals 

     #save the vote 
     super(Vote, self).save(); 

回答

1

下面回答這個問題嗎?

class Question(models.Model): 
    blablabla #your definition 

    def count_yes(self): 
     return Vote.objects.filter(question__exact = self, 
            choice__exact = 'Y').count() 
+0

它的工作原理,謝謝。我唯一不喜歡的是可擴展性。它將檢索所有投票對象作爲列表。我寧願讓ORM做聚合查詢。 BTW有一個錯字(選擇應該是選擇)。 – Keyo 2010-12-18 07:53:27

+0

我的錯誤,就是如何在ORM中完成計數查詢。 – Keyo 2010-12-18 08:10:04

1

我已經重寫Igautier的方法有點不同:

class Question(models.Model): 
    # your defn 

    def count_yes(self): 
     return self.votes_set.filter(choice='Y') 
    def count_no(self): 
     return self.votes_set.filter(choice='N') 

這(和Igautier的答案)背後的原因是,數據全部存儲在數據庫中已經:具有總共是存儲,同時每次調用這些方法都會阻止額外的查詢,這意味着在保存時需要額外的工作,並且存儲在數據庫中的數據變得衝突。如果你發現性能成爲一個問題(我強烈建議你不要擔心它,直到它),那麼你可以看看緩存查詢集(嘗試johnny-cache,用於自動或其他緩存系統),甚至數據庫觸發器。我認爲這可能會將它從您的請求循環中移出:數據庫將在發生寫入時更新值。顯然,這將取決於你的DBMS。

最後,它不是直接回答您的問題,而是您提出每個用戶每個問題一票。

class Vote(models.Model): 
    # Your defn 

    class Meta: 
     unique_together = (
      ('author', 'question'), 
     ) 

然後,您將不必依賴應用程序邏輯來保持該約束爲真。儘管如此,你可能會阻止用戶對自己的問題進行投票。

+0

我在想我可能會重寫投票模型保存方法並添加一個事務來增加存儲在問題表上的投票值。 – Keyo 2010-12-18 10:58:29

+0

嗯。如果兩個人同時投票會發生什麼?每一筆交易都將在交易中進行,但仍會存在競爭狀況。 – 2010-12-21 08:08:31

相關問題