我有下一个模型(我只留下了与问题相关的列):
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引用同一组模型)。因此,可以防止在将学生加入不同组的考试时出现这种情况。
答案 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)
这不能防止非法状态,例如您可以在已经有结果的情况下更改学生的组。