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的评论,这是一个错误的答案?