Вот лучшее решение, если вам нужна дополнительная гибкость и вы не хотите менять поле модели. Просто добавьте этот пользовательский валидатор:
#Imports
from django.core.exceptions import ValidationError
class validate_range_or_null(object):
compare = lambda self, a, b, c: a > c or a < b
clean = lambda self, x: x
message = ('Ensure this value is between %(limit_min)s and %(limit_max)s (it is %(show_value)s).')
code = 'limit_value'
def __init__(self, limit_min, limit_max):
self.limit_min = limit_min
self.limit_max = limit_max
def __call__(self, value):
cleaned = self.clean(value)
params = {'limit_min': self.limit_min, 'limit_max': self.limit_max, 'show_value': cleaned}
if value: # make it optional, remove it to make required, or make required on the model
if self.compare(cleaned, self.limit_min, self.limit_max):
raise ValidationError(self.message, code=self.code, params=params)
И это можно использовать как таковое:
class YourModel(models.Model):
....
no_dependents = models.PositiveSmallIntegerField("How many dependants?", blank=True, null=True, default=0, validators=[validate_range_or_null(1,100)])
Два параметра - это max и min, и это допускает нулевые значения. Вы можете настроить валидатор, если хотите, избавившись от отмеченного оператора if или изменив свое поле на пустое = False, null = False в модели. Это, конечно, потребует миграции.
Примечание: мне пришлось добавить валидатор, потому что Django не проверяет диапазон на PositiveSmallIntegerField, вместо этого он создает smallint (в postgres) для этого поля, и вы получаете ошибку БД, если указанное число выходит за пределы диапазона.
Надеюсь, это поможет :) Подробнее о валидаторах в Django .
PS. Я основал свой ответ на BaseValidator в django.core.validators, но все иначе, кроме кода.