在多对多字段中使用 through 属性并遇到 "Non-Unique" 字段要求
Using through attribute in a many-to-many filed and encountering with "Non-Unique" field requirement
我正在做一个新项目,包括 问题 和一些学生作为 参与者,我想在 table,所以为此,我创建了一个 Questions table 并制作了一个 correspond to QuestionsParticipant 添加“through”属性。
但是当我为特定问题记录特定参与者时,我不能再使用该参与者来回答新问题了!为什么?
class Questions(models.Model):
course = models.ForeignKey(Course, blank=False)
question_author = models.ForeignKey(Author, blank=False)
question_details = models.CharField(max_length=100, blank=False, default='')
members = models.ManyToManyField(CourseParticipant, through='QuestionsParticipant')
question_type = models.CharField(choices=question_types, max_length=1, default='1')
timestamp = models.DateTimeField(auto_now_add=True)
class QuestionsParticipant(models.Model):
question = models.ForeignKey(Questions)
participant = models.ForeignKey(CourseParticipant, primary_key=True)
tries = models.PositiveIntegerField(blank=False, default=0)
flag = models.BooleanField(default=False)
flag_reason = models.CharField(max_length=50, blank=True, default='')
success = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
从 QuestionsParticipant.participant
定义中删除 primary_key=True
参数。主键是唯一的,因此对于每个参与者,QuestionsParticipant
table.
中的记录不能超过一条
我认为您在设计问题与其参与者之间的关系时存在逻辑问题。在您的上下文中,多对多关系是一个问题可以由多个参与者回答,一个参与者可以回答多个问题。
这意味着;你不应该把 primary_key=True
放在 QuestionsParticipant
table 中的任何 FK,否则你会破坏 M2M 关系本身。
如果您希望参与者只回答一个问题,您可以将 question = models.ForeignKey(Questions)
到 CourseParticipant
table.
此外,请注意型号名称应始终为单数。 (Question
、QuestionParticipant
等)
我正在做一个新项目,包括 问题 和一些学生作为 参与者,我想在 table,所以为此,我创建了一个 Questions table 并制作了一个 correspond to QuestionsParticipant 添加“through”属性。 但是当我为特定问题记录特定参与者时,我不能再使用该参与者来回答新问题了!为什么?
class Questions(models.Model):
course = models.ForeignKey(Course, blank=False)
question_author = models.ForeignKey(Author, blank=False)
question_details = models.CharField(max_length=100, blank=False, default='')
members = models.ManyToManyField(CourseParticipant, through='QuestionsParticipant')
question_type = models.CharField(choices=question_types, max_length=1, default='1')
timestamp = models.DateTimeField(auto_now_add=True)
class QuestionsParticipant(models.Model):
question = models.ForeignKey(Questions)
participant = models.ForeignKey(CourseParticipant, primary_key=True)
tries = models.PositiveIntegerField(blank=False, default=0)
flag = models.BooleanField(default=False)
flag_reason = models.CharField(max_length=50, blank=True, default='')
success = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
从 QuestionsParticipant.participant
定义中删除 primary_key=True
参数。主键是唯一的,因此对于每个参与者,QuestionsParticipant
table.
我认为您在设计问题与其参与者之间的关系时存在逻辑问题。在您的上下文中,多对多关系是一个问题可以由多个参与者回答,一个参与者可以回答多个问题。
这意味着;你不应该把 primary_key=True
放在 QuestionsParticipant
table 中的任何 FK,否则你会破坏 M2M 关系本身。
如果您希望参与者只回答一个问题,您可以将 question = models.ForeignKey(Questions)
到 CourseParticipant
table.
此外,请注意型号名称应始终为单数。 (Question
、QuestionParticipant
等)