Проверка сложных отношений в Django

Я разрабатываю Django-приложение, которое помогает учителям наблюдать за учениками во время уроков. за учениками во время уроков. Я определил модели для Lesson и Student, и модель FocusGroup для учеников, которые будут наблюдаться во время данного Lesson, Объект FocusGroup имеет поля для наблюдения за поведением Student во время Lesson. Выборка учащихся наблюдается во время данного Lesson, и наблюдения должны быть зарегистрированы в полях FocusGroup. В рамках подготовки учителя к данному Lesson, он присваивает этот Lesson ряду FocusGroup экземпляров (представляющих Student). Теперь, приложению необходимо обеспечить, чтобы что один и тот же Student назначается не более одного раза данному Lesson. Я уже делаю это в своем шаблоне, но я хочу обеспечить уникальность и на стороне сервера.

Диаграмма должна иллюстрировать это: UML diagram of Lesson, FocusGroup and Student relationships Мой вопрос заключается в том, как я должен гарантировать, что 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')
        ]
Вернуться на верх