在多对多字段中使用 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.

此外,请注意型号名称应始终为单数。 (QuestionQuestionParticipant 等)