@v1ceo

Как сделать ограничение по количеству ссылающихся на объект объектов?

Цель: сделать ограничение в максимум 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),
                )
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы