验证 Django 中的复杂关系
Validating complex relationships in Django
我正在开发一个帮助教师观察的Django应用程序
上课时的学生。我已经为 Lesson
和 Student
定义了模型,
以及在给定的 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')
]
我正在开发一个帮助教师观察的Django应用程序
上课时的学生。我已经为 Lesson
和 Student
定义了模型,
以及在给定的 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')
]