Oto najlepsze rozwiązanie, jeśli potrzebujesz dodatkowej elastyczności i nie chcesz zmieniać pola modelu. Wystarczy dodać ten niestandardowy walidator:
#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)
i może być stosowany jako taki:
class YourModel(models.Model):
....
no_dependents = models.PositiveSmallIntegerField("How many dependants?", blank=True, null=True, default=0, validators=[validate_range_or_null(1,100)])
Oba parametry są max i min, a to pozwala na wartości null. Możesz dostosować walidator, jeśli chcesz, pozbywając się zaznaczonej instrukcji if lub zmieniając puste pole = False, null = False w modelu. Będzie to oczywiście wymagało migracji.
Uwaga: Musiałem dodać walidator, ponieważ Django nie sprawdza poprawności zakresu na PositiveSmallIntegerField, zamiast tego tworzy smallint (w postgres) dla tego pola i otrzymujesz błąd DB, jeśli podana wartość jest poza zakresem.
Mam nadzieję, że to pomaga :) Więcej o Validators in Django.
PS. Oparłem swoją odpowiedź na BaseValidator w django.core.validators, ale wszystko jest inne, z wyjątkiem kodu.
Powinienem wspomnieć, że chcę również, aby ograniczenie zostało zastosowane w administratorze Django. Aby to uzyskać, przynajmniej dokumentacja ma to do powiedzenia: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin – sampablokuper
W rzeczywistości, pre -1,0 Django wydaje się mieć naprawdę eleganckie rozwiązanie: http://www.cotellese.net/2007/12/11/adding-model-field-validation-to-the-django-admin-page/. Zastanawiam się, czy istnieje równie elegancki sposób robienia tego w wersji svn Django. – sampablokuper
Jestem zawiedziony, gdy się dowiem, że * nie * wydaje się być eleganckim sposobem na zrobienie tego z obecnym Django svn. Więcej informacji można znaleźć w tym wątku dyskusji: http://groups.google.com/group/django-users/browse_thread/thread/7f23e90d9d3aedd4 – sampablokuper