2011-07-07 200 views
1

Django的模型我有這些模型3多對多領域

class User(models.Model): 
    user_name = models.CharField() 
    ph_number = models.CharField() 

class ExamPaper(models.Model): 
    paper_name = models.CharField() 
    paper_subject = models.CharField() 

class Questions(models.Model): 
    paper = models.ManyToManyField(ExamPaper, related_name='question_set') 
    question_num = models.IntegerField() 
    question_text = models.TextField() 

現在我想每個用戶每個文件存儲每一個問題的結果。紙張會有多個問題,一個問題也可能屬於多個論文。用戶可以給出多個論文和多個問題。

我想mysql表有用戶,紙張和問題來定義主鍵所有在一起和兩個字段的'標記'和'結果'。我無法理解如何在django模型中執行此操作。這項工作:

class Result(models.Model): 
    user = models.ManyToManyField(User) 
    paper = models.ManyToManyField(ExamPaper) 
    question = models.ManyToManyField(Question) 
    marks = models.IntegerField() 
    result = models.CharField() 

請任何人任何人都可以解釋?

+0

使用默認的'id'字段作爲'Result'的主鍵會更好。命名也會更好; '問題'應該是'問題'(因爲一個記錄是一個問題)並且在結果中有一個字段'result'是令人困惑的,但是我不能提出更好的建議,因爲我不知道'marks'和'result代表。 –

回答

4

你應該用一個一對多(ForeignKey)的關係,而不是許多一對多:

class Result(models.Model): 
    user = models.ForeignKey(User) 
    paper = models.ForeignKey(ExamPaper) 
    question = models.ForeignKey(Question) 
    marks = models.IntegerField() 
    result = models.CharField() 

    class Meta: 
     unique_together = (("user", "paper", "question"),) 

如果一個問題只能在一個試卷出現,然後Question.paper也應該一個ForeignKey,你可以從Result刪除paper字段。

+0

另外,你可能不需要'paper'字段,因爲你可以通過執行'result.question.paper'來訪問它,除非'Result'中的'paper'字段當然不會相同如果這是有道理的,那麼'Question'中的'paper'字段與'Result'相關。 –

+1

@Bryce:不能這樣做,因爲'result.question.paper'是一個多對多的關係。即一個問題可能會出現在多篇論文中。我認爲這是一個考試系統,其中包含從池中隨機選擇的一組問題,因此每個學生的考試都是不同的,從而避免作弊。 –

+0

通過將manytomany字段更改爲foreignkey字段,我得到了正確的數據庫模式。謝謝。其實問題可以出現在多篇論文中,因此我需要將用戶,論文和問題獨特地結合在一起。再次感謝。 – Shwetanka

0

首先,您可能需要_meta類的unique_together選項。見:https://docs.djangoproject.com/en/1.3/ref/models/options/#unique-together

編輯:看起來像django至少需要一個主鍵字段。 https://docs.djangoproject.com/en/1.3/topics/db/models/#automatic-primary-key-fields

+0

但它不允許使用unique_together與ManyToManyFields – Shwetanka

+0

你在哪裏看到的? – mklauber

+0

我運行syncdb,它給了我驗證錯誤。 – Shwetanka