2015-10-12 58 views
0

我正在使用Django來實現投票系統。投票由幾個類別組成,每個類別只允許一次投票。舉個例子,讓我們來投票選出一所學校的每個科目中哪個教師最好。您的設置可能是這樣的,只有一個每個類別允許每人投票:Django如何設置abc,使其中一個實例恰好指向每個類別的一個實例

Science: 
    Teacher A 
    Teacher B 
    Teacher C 

English 
    Teacher D 
    Teacher E 

History 
    Teacher F 
    Teacher G 

在此設置中,例如,學生可以投票教師A,E和F,但不是一個教師, B和G(因爲教師A和B屬於同一科目)。我怎麼能用Django中的Option(一個你可以投票的人),Category和Vote抽象基類來表示這個?換句話說,你如何能夠一般地設置它,使得每個投票實例對每個選項實例(特定投票所用的選項)都有一個引用,但是它的所有選項都沒有引用相同的類別。

更新

爲了澄清,該解決方案應該抽象基類的工作,從而繼承自動設置使用任何模型關係。例如,如果Option模型要將FK應用於Category模型,那麼我需要一種方法來讓類的子類化Option和Category通過子類化來設置它們的FK。

回答

0

你基本上需要三張表,每張表都有自己的Django模型:教師表,分類表和投票,教師與類表有關的外鍵關係(除非他們可以在幾個類別上,那麼你需要多個到許多關係),投票表對教師和類別持有fk,並且可能是發佈投票的用戶的id。

現在最重要的是確保您不能在單個類別中投票兩次,您可以通過此代碼確保在ORM級別執行此操作,或者您可能還希望驗證在用戶發佈投票表單後

class Vote(models.Model): 
    teacher = models.ForeignKey("Teacher") 
    category = models.ForeignKey("Category") 
    voter = models.ForeignKey("User") 

    def save(self,*args, **kwargs): 
     votes = Vote.objects.filter(category=self.category,user=self.user) 
     if len(votes)>0: #don't save a vote in the same category 
      raise Exception("A vote has already been cast for this category") 
     super(Vote,self).save(*args, **kwargs) 

該保存方法確保在同一類別的單個用戶不能選兩次

+0

感謝您的響應。幾個問題。 1.保存應該是投票內的重寫嗎? 2.每個投票應該能夠在每個類別中選擇一名教師,這是否意味着這個答案適用於一點變化,或者它不再可行? – ericmarkmartin

+0

yes保存方法是模型保存方法的重寫,我編輯了我的答案以更好地顯示python縮進,但即使教師可能是多個類別的一部分,解決方案仍然可行。 –

+0

我想你是誤解。這並不是說我需要一個老師參與多個類別,而是需要一個投票才能投票給多個類別。我也不相信你是解決繼承問題的解決方案。 – ericmarkmartin

相關問題