Установите ограничение для форм с одинаковым значением Django

Итак, что я хочу сделать, так это установить предел форм с одинаковым значением. Есть различные виды деятельности из иностранной модели, на которые студенты могут подавать заявки. У меня есть имя(naam), номер студента(studentnummer), деятельность(activiteit) и класс(klas), и я хочу установить ограничение на 10 форм с одинаковой деятельностью (максимум людей, которые могут заниматься одной деятельностью) и ограничение на 1 для номера студента (чтобы студенты могли подавать заявки только на одну деятельность).

models.py

class Klas(models.Model):
    klas = models.CharField(max_length=8)

    def __str__(self):
        return f"{self.klas}"
    
class Activiteit(models.Model):
    titel = CharField(max_length=64)
    docent = CharField(max_length=32)
    icon = models.ImageField()
    uitleg = models.TextField()

    def __str__(self):
        return f"{self.id}:{self.titel}:{self.docent}"
    
class Aanmelden(models.Model):
    naam = CharField(max_length=32)
    studentnummer = IntegerField()
    klas = ForeignKey(Klas, on_delete=models.CASCADE, default=None, blank=True)
    activiteit = ForeignKey(Activiteit, on_delete=models.CASCADE, default=None, blank=True)

    def __str__(self):
        return f"{self.id}:{self.naam}:{self.studentnummer}"
 

views.py

def home(request):
   activiteiten = Activiteit.objects.all()
   
   form = AanmeldenForm()
   if request.method == 'POST':
       form = AanmeldenForm(request.POST)
       if form.is_valid():
           form.save()
           
   return render(request, 'home.html', {
       'activiteiten': activiteiten,
       'form':form,
   })

forms.py

class AanmeldenForm(forms.ModelForm):
   class Meta:
       model = Aanmelden
       fields = (
           'naam','studentnummer','klas','activiteit'
       )

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

Вероятно, вам нужно иметь переменную внутри класса Aktiviteit, такую как plaatsen_beschikbaar, которая инициализируется на 10 при создании нового экземпляра Aktiviteit. Затем при успешном Aanmelden экземпляра вы уменьшаете ее на единицу. Вам нужно убедиться, что в вашей модели plaatsen_beschikbaar не может быть меньше нуля, и если кто-то удаляет аанмелдинг, то увеличивает переменную на 1. Редактирование: или вы используете валидатор, такой как приведенный ниже, для ограничения аанмелдинга. Вы также можете сделать так, чтобы ваша модель имела @свойство, которое возвращает plaatsen_beschikbaar вместо использования поля. Если подумать, то это кажется лучшим планом, отсюда и эта правка

Чтобы убедиться, что у студента может быть только 1 Aanmelden, вы можете просто сделать studentnummer уникальным в классе Aanmelden. Но это делает вашу модель не перспективной, если в будущем вы решите, что студенты могут подписаться на два или три вида деятельности. В этом случае вам необходимо иметь связь внешнего ключа с Student и ограничить количество Aanmelden, которое может иметь студент, используя валидатор, например, так

def beperk_aanmelden(value):
    if Aanmelden.objects.filter(student_id=value).count() >= 1:
        raise ValidationError('Student heeft al de maximale aanmeldingen')

Тогда в вашей Aanmelden модели:

student = ForeignKey(Student, validators=[beperk_aanmelden,]
Вернуться на верх