Django:在模型级别而不是列级别应用验证器

时间:2019-11-17 01:55:10

标签: django django-models django-validation

假设我有以下Django模型:

class PersonClub(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    club = models.ForeignKey(Club, on_delete=models.CASCADE)
    year = models.PositiveSmallIntegerField()

    class Meta:
        unique_together = ("person", "club", "year")

我需要在执行此规则的模型级别应用验证器:

  

一个人在一年中只能属于3个不同的俱乐部。

执行此操作的最佳方法是什么?我想我的验证器应该看起来像这样,但是我不知道将它放在哪里:

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

def validate_annual_clubs_per_person(obj):
    count = PersonClub.objects.filter(person=obj.person, year=obj.year).count()
    if count >= 3:
        raise ValidationError(
            _("%(person)s has exceeded max clubs for %(year)s"),
            params={"person": obj.person, "year": obj.year},
        )

1 个答案:

答案 0 :(得分:0)

# You can put validation in models.py and apply validation for a field

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

def validate_annual_clubs_per_person(obj):
    count = PersonClub.objects.filter(person=obj.person, year=obj.year).count()
    if count >= 3:
        raise ValidationError(
            _("%(person)s has exceeded max clubs for %(year)s"),
            params={"person": obj.person, "year": obj.year},
        )


class PersonClub(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, validators=[validate_annual_clubs_per_person])
    club = models.ForeignKey(Club, on_delete=models.CASCADE)
    year = models.PositiveSmallIntegerField()

    class Meta:
        unique_together = ("person", "club", "year")