#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."))