Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有3个多对多字段的Django模型_Python_Django_Django Models - Fatal编程技术网

Python 具有3个多对多字段的Django模型

Python 具有3个多对多字段的Django模型,python,django,django-models,Python,Django,Django Models,我有这些模型 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): pape

我有这些模型

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表中的user、paper和question一起定义主键,还有两个字段“marks”和“result”。我无法理解在django模型中如何做到这一点。这是否有效:

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

请任何人解释一下?

首先,您可能希望为_meta类提供唯一的_together选项。见:


编辑:看起来django至少需要一个主键字段

首先,您可能希望_meta类具有唯一的_together选项。见:


编辑:看起来django至少需要一个主键字段

您应该使用一对多()关系,而不是多对多:

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也应该是一个
外键
,您可以从
结果中删除
纸张
字段

您应该使用一对多()关系,而不是多对多:

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也应该是一个
外键
,您可以从
结果
中删除
纸张
字段

,但它不允许将unique_与许多字段一起使用。您不应该在
结果
中使用
许多
。对于一组用户、一组问题和一组结果,您没有一个结果。。。如果你这样做了,我认为你需要重构你的模式,因为在编写查询时,事情会变得非常痛苦。但是它不允许将unique_与许多字段一起使用。你不应该在
结果
中使用
许多
。对于一组用户、一组问题和一组结果,您没有一个结果。。。如果你这样做了,我认为你需要重构你的模式,因为在编写查询时事情会变得非常痛苦。最好使用默认的
id
字段作为
Result
的主键。命名也可以更好<代码>问题
应该是<代码>问题
(因为一条记录就是一个问题),并且在<代码>结果
中有一个字段<代码>结果
,这会造成混淆,但是我不能推荐更好的,因为我不知道
标记
结果
代表什么。最好使用默认的
id
字段作为
结果
的主键。命名也可以更好<代码>问题
应该是
问题
(因为一条记录就是一个问题),并且在
结果
中有一个字段
结果
是令人困惑的,但是我不能提出更好的建议,因为我不知道
标记
结果
代表什么。另外,您可能也不需要
纸张
字段,因为您可以通过执行
result.question.paper
来访问它,除非
result
中的
paper
字段与
问题
中与
结果
相关的
paper
字段不同,如果这有意义的话。@布莱斯:我不能这么做,因为
结果.问题.论文
是一种多对多的关系。也就是说,一个问题可以出现在多篇论文中。我认为这是针对一个系统,其中考试包含从池中随机选择的一组问题,因此每个学生的考试都不同,从而阻止作弊。通过将许多字段更改为foreignkey字段,我得到了我想要的db模式。谢谢实际上,问题可以出现在多篇论文中,因此我需要将用户、论文和问题结合在一起。再次感谢。啊,错过了。也许我应该投否决票,因为根据OP的评论,这是一个错误的答案?而且,您可能也不需要
paper
字段,因为您可以通过执行
result.question.paper
访问该字段,当然,除非
结果中的
纸张
字段与
问题中与
结果
相关的
纸张
字段不一样,如果这有意义的话。@Bryce:不能这样做,因为
结果.问题.纸张
是一种多对多关系。也就是说,一个问题可以出现在多篇论文中。我认为这是针对一个系统,其中考试包含从池中随机选择的一组问题,因此每个学生的考试都不同,从而阻止作弊。通过将许多字段更改为foreignkey字段,我得到了我想要的db模式。谢谢实际上,问题可以出现在多篇论文中,因此我需要将用户、论文和问题结合在一起。再次感谢。啊,错过了。也许我应该投否决票,因为根据OP的评论,这是一个错误的答案?