Проверка сложных отношений в Django
Я разрабатываю Django-приложение, которое помогает учителям наблюдать за учениками во время уроков.
за учениками во время уроков. Я определил модели для Lesson
и Student
,
и модель FocusGroup
для учеников, которые будут наблюдаться во время данного Lesson
,
Объект FocusGroup
имеет поля для наблюдения за поведением Student
во время Lesson
.
Выборка учащихся наблюдается во время данного Lesson
,
и наблюдения должны быть зарегистрированы в полях FocusGroup
.
В рамках подготовки учителя к данному Lesson
,
он присваивает этот Lesson
ряду
FocusGroup
экземпляров (представляющих Student
).
Теперь, приложению необходимо обеспечить, чтобы
что один и тот же 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')
]