- Walidacja metodą 'clean' powinna dotyczyć zależności na poziomie całego obiektu.
- Design Django definiuje, że nie uruchamia się walidatorów automatycznie przy każdorazowym wywołaniu save() na obiekcie modelu a zamiast tego wymaga wywołania full_clean(). Jedynie przypadku walidacji unikalności (np. gdy używasz unique=True lub UniqueConstraint), Django automatycznie sprawdza unikalność przy zapisie obiektu.
- Wyjątkiem od powyższego są również Formularze Django (np. ModelForm), które automatycznie wywołują walidację, ponieważ w kontekście formularzy walidacja jest ważnym krokiem w procesie obsługi danych wejściowych od użytkownika.
from django.core.exceptions import ValidationError
from django.core.validators import MinLengthValidator
class Author(models.Model):
first_name = models.CharField(max_length=100, validators=[MinLengthValidator(2)])
last_name = models.CharField(max_length=100)
def __str__(self) -> str:
return f"{self.first_name} {self.last_name}"
# Tworzymy obiekt
author = Author(first_name="A", last_name="Smith")
# Walidacja nie zostanie uruchomiona, jeśli wywołamy tylko save()
author.save() # Nie uruchomi walidatorów na poziomie pól
# Aby walidacja się odbyła, musimy wywołać full_clean()
author.full_clean() # Uruchomi walidację, w tym MinLengthValidator
author.save() # Teraz zapisuje obiekt po walidacji