【问题标题】:Django: apply validator at model level instead of column levelDjango:在模型级别而不是列级别应用验证器
【发布时间】:2019-11-17 01:55:10
【问题描述】:

假设我有以下 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},
        )

【问题讨论】:

    标签: django django-models django-validation


    【解决方案1】:
    # 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")
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2011-02-16
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多