Ось найкраще рішення, якщо ви хочете отримати додаткову гнучкість і не хочете змінювати поле своєї моделі. Просто додайте цей спеціальний валідатор:
#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)])
Два параметри - макс і хв, і це дозволяє нулю. Ви можете налаштувати валідатор, якщо вам подобається, позбувшись позначеного, якщо оператор або змінити поле на пусте = False, null = False в моделі. Звичайно, це вимагатиме міграції.
Примітка. Мені довелося додати валідатор, оскільки Django не перевіряє діапазон на PositiveSmallIntegerField, натомість він створює мале число (у постгресах) для цього поля, і ви отримуєте помилку БД, якщо вказане число не відповідає діапазону.
Сподіваюся, це допомагає :) Детальніше про валідатори в Джанго .
PS. Я базував свою відповідь на BaseValidator в django.core.validators, але все інакше, окрім коду.