【问题标题】:Add constraint to ManyToMany table on Django model在 Django 模型上向 ManyToMany 表添加约束
【发布时间】:2018-07-10 12:09:47
【问题描述】:

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

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)

所以我有 Student 模型,它有一个 Group 和许多 Examin。我有一个针对特定 GroupExamin 模型。我有连接表 ExaminResult 将学生与他们的考试联系起来(稍后我将在此处添加成绩列)。我的问题是如何向表 ExaminResult 添加约束,以便将学生添加到同一组的考试中(以便此表中的学生和考试具有对同一组模型的引用)。这样可以防止学生被添加到不同组的考试中。

【问题讨论】:

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


    【解决方案1】:

    据我所知,没有直接的方法可以在 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)
    

    这并不能防止非法状态,例如在学生已经有结果后,您更改他们的组。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2017-11-30
      • 2013-09-06
      • 2020-09-20
      相关资源
      最近更新 更多