簡體   English   中英

Django-如何設置abc,以便一個實例完全引用每個類別的一個實例

[英]Django- How to set up abc's so that an instance of one refers to exactly one instance of each category

我正在使用Django實現投票系統。 表決由幾個類別組成,每個類別只能進行一次表決。 例如,讓我們對一所學校的每個學科中最好的老師進行投票。 您的設置可能如下所示,每人每個類別只允許投票一次:

Science:
  Teacher A
  Teacher B
  Teacher C

English
  Teacher D
  Teacher E

History
  Teacher F
  Teacher G

例如,在這種設置中,學生可以投票給教師A,E和F,但不能投票給教師A,B和G(因為教師A和B在同一主題內)。 如何用Django中的Option(您可以投票的個人),Category和Vote抽象基類來表示呢? 換句話說,您如何通用地設置它,以使每個Vote實例對每個Option實例(特定表決所針對的Options)都有一個引用,而沒有一個Option引用相同的類別。

更新資料

為了明確起見,該解決方案應適用於抽象基類,以便繼承自動設置所使用的任何模型關系。 例如,如果Option模型要對Category模型具有FK,則我需要一種將Option和Category子類化的類通過子類操作來設置其FK的方法。

您基本上需要三個表,每個表在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)

該保存方法可確保單個用戶不能在同一類別中投票兩次

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM