вызвать ошибку проверки, если в одном клубе два президента?

#django #validation #django-models

Вопрос:

в моей модели я не хочу, чтобы два президента одного и того же клуба. У меня 6 клубов, так что у меня тоже больше не будет 6 президентов. Я новичок в проверке, я пытался использовать чистый метод, но ошибка не возникнет.

моя модель:

 class MyUser(AbstractUser):
    STUDENT = 1
    INSTRUCTOR = 2
    ADMIN = 3
    ROLE_CHOICES = (
        (STUDENT, 'student'),
        (INSTRUCTOR, 'instructor'),
        (ADMIN, 'admin'),
    )
    club_name = (
        (0, 'ISOM'),
        (1, 'Accounting'),
        (2, 'PA'),
        (3, 'Finance'),
        (4, 'Management amp; Marketing'),
        (5, 'Economics'),
    )
    is_president = models.BooleanField(default=False)
    club_name = models.IntegerField(choices=club_name, default=0, verbose_name='Club/Department')
    roles = models.PositiveSmallIntegerField(choices=ROLE_CHOICES)
 

проверка, которую я использовал:

 def clean(self):
          club = MyUser.objects.all()
          president = MyUser.objects.all()
          try:
            club.objects.get(club_name__iexact=club_name)
            president.objects.get(is_president__iexact=is_president)

          except club.DoesNotExist:
            return club_name, is_president
          raise ValidationError(_("A president for this club already existed."))
 

Ответ №1:

Я бы предложил выделить Клуб в качестве собственной модели. Он чище и позволит вам добавлять больше клубов в будущем.

 class Club(models.Model):
    name = models.CharField(max_length=200)
    president = models.ForeignKey(MyUser, on_delete=models.CASCADE, null=True, blank=True)
 

Для членства в клубе у вас может быть промежуточная модель:

 class ClubMember(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    club = models.ForeignKey(Club, on_delete=models.CASCADE)
 

Комментарии:

1. Это правильный ответ … не пытайтесь исправить это с помощью кода, когда неверно моделирование БД!

2. спасибо за ваш совет, но я не могу этого сделать, так как клубы исправлены, и при создании пользователя необходимо выбрать клуб.. если я добавил название клуба в свою модель клуба, то при создании пользователя, который он/она является президентом, будет невозможно использовать сигналы для автоматического создания президента клуба.

Ответ №2:

Попробуйте это:

 def clean(self):
        cleaned_data = super().clean()
        club_nam = cleaned_data.get('club_nam')
        
        if MyUser.objects.filter(club_name=club_name, is_president=True).exists():
            raise ValidationError(_("A president for this club already existed."))
 

Комментарии:

1. не сработало и выдало мне эту ошибку объект «Нетип» не имеет атрибута «get»

2. Поделитесь всеми представлениями и формами кода и подумайте об ответе @TaipanRex

3. спасибо, Реза, твой ответ помог мне найти решение

Ответ №3:

Это решение, которое я придумал и которое работало на меня ( вдохновленное ответом @Reza):


 def clean(self):
   if MyUser.objects.filter(club_name = self.club_name, is_president = True).exists():

      raise ValidationError(_("A president for this club already existed."))