验证 Django 中的复杂关系

Validating complex relationships in Django

我正在开发一个帮助教师观察的Django应用程序 上课时的学生。我已经为 LessonStudent 定义了模型, 以及在给定的 Lesson 期间观察学生的 FocusGroup 模型, FocusGroup 对象具有用于观察 Student 行为的字段 Lesson。 在上述 Lesson 期间观察了一部分学生, 并将观察记录在 FocusGroup 字段中。 作为老师准备 Lesson 的一部分, 他将 Lesson 分配给了一些 FocusGroup 个实例(代表 Student 个) 现在,应用程序需要确保 same Student 最多分配给给定的 Lesson 一次。 我已经在我的模板中这样做了, 但我也想确保服务器端的唯一性。

图表应说明这一点: 我的问题是我应该如何确保 Lesson 被分配相同 Student最多一次。

我应该在 FocusGroup 模型中还是在接收视图中执行此操作? 我应该如何在 Django 中安全地确保这种关系?

我目前的实现检查 FocusGroup-Lesson 的唯一性, 但是随着新的 FocusGroup 个实例的生成,有可能 Student 由多个 FocusGroup 实例表示 分配给 Lesson.

models.py

from django.db.models.functions      import Random
from django.db                       import models
from django.db.models.fields.related import ForeignKey
from django.db.models.fields         import AutoField, BooleanField, CharField, DateField, DateTimeField, IntegerField, TextField, URLField

class Student(models.Model):
    id = models.UUIDField(
        primary_key=True, 
        default=uuid.uuid4, 
        editable=False
    )
    name = models.CharField()

class Lesson(models.Model):
    id = AutoField(primary_key=True)
    afholdt = DateField(help_text='Planlagt / faktisk dato for modulet')

class FocusGroup(models.Model):
    id = AutoField(primary_key=True)
    student = models.ForeignKey('Student', on_delete=models.RESTRICT, null=True)
    lesson = models.ForeignKey(
        'Lesson', 
        models.SET_NULL,
        blank=True, 
        null=True, 
    )
    rand_rank = models.FloatField( # Used to randomize sampling of Students
        validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
        default=Random(),
        editable=False,
        null=False
    )
    score    = IntegerField(blank=True, null=True)

在这种情况下,定义一个 UniqueConstraint 就足以确保学生只会被分配一次课程,而不管焦点小组是什么,所以:

class FocusGroup(models.Model):
    ...
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['student', 'lesson'], name='unique_lesson_to_student')
        ]