Цель: сделать ограничение в максимум 20 студентов в одной группе
Изначально я пытался сделать это через валидацию, всё отрабатывает хорошо, когда в группе 20 студентов и я пытаюсь добавить в неё нового - выходит ошибка, но бывает, что мне нужно поменять информацию(в админке) о студенте, который уже состоит в группе, где на данный момент 20 студентов и вот здесь также выходит ошибка, так как после изменения информации об объекте 'Студент' срабатывает валидация, каунтер фиксирует 20 студентов и выпадает ошибка, хотя новый студент в группу не добавлялся, а изменялась информация об уже состоящем в группе студенте.
Как можно решить эту проблему или может быть необходимо воспользоваться чем-то другим, а не валидатором?
def validate_number_of_students(value):
if User.objects.filter(group=value).count() >= 20:
raise ValidationError('Already 20 students in group (20)')
class User(AbstractUser):
role = models.CharField(max_length=max([len(role[0]) for role in ROLES]),
choices=ROLES,
default=USER,
)
group = models.ForeignKey('structure.Group',
on_delete=models.SET_NULL,
related_name='users',
blank=True,
null=True,
validators=(validate_number_of_students, )
)
Пытался также решить проблему с помощью ограничения constraint, но оно у меня не работает, может быть я пишу код не так? (у меня есть два приложения в проект - 1)User, где хранится модель юзера 2) Structure, где хранится модель группы.)
models.CheckConstraint(
name="limit_students_in_group",
check=IntegerLessThan(
models.Count("group", filter=models.Q(group=models.F("group"))),
20),
)