向Django模型上的ManyToMany表添加约束

时间:2018-07-10 12:09:47

标签: django django-models many-to-many

我有下一个模型(我只留下了与问题相关的列):

class Student(models.Model):
    student_examin = models.ManyToMany("Examin",
        verbose_name=u"Examin",
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
        through="ExaminResult")
    student_group = models.ForeignKey("Group",
        verbose_name=u"Група",
        blank=False,
        null=True,
        on_delete=models.PROTECT)

class Examin(models.Model):
    examin_group = models.OneToOne("Group",
        verbose_name=u"Група",
        blank=False,
        null=True,
        on_delete=models.CASCADE)

class ExaminResult(models.Model):
        student = models.ForeignKey("Student",
            verbose_name=u"Студент",
            blank=False,
            null=False,
            on_delete=models.CASCADE)

        examin = models.ForeignKey("Examin",
            verbose_name=u"Екзамін",
            blank=False,
            null=False,
            on_delete=models.CASCADE)

因此,我有学生模型,该模型具有 Group 和许多 Examin 。我有一个用于特定 Examin 模型。我有连接表 ExaminResult ,该表将学生与他们的考试联系在一起(稍后,我将在此处添加成绩列)。我的问题是如何向表ExaminResult添加约束,以便将学生添加到同一组的examin中(以便该表中的student和examin引用同一组模型)。因此,可以防止在将学生加入不同组的考试时出现这种情况。

1 个答案:

答案 0 :(得分:0)

据我所知,没有直接的方法可以从ORM在数据库级别强制执行该操作。您可以做的是自己validation

class ExaminResult(models.Model):
    # ....
    def clean(self):
         if self.student.student_group != self.examin.examin_group:
            # this will appear in form.errors if saved through a ModelForm
            raise ValidationError('Group mismatch betwenn examin and student!')

    def save(self, *args, **kwargs):
        # make sure any saving triggers validation
        self.clean()
        super(ExaminResult, self).save(*args, **kwargs)

这不能防止非法状态,例如您可以在已经有结果的情况下更改学生的组。

相关问题