Inne zaawansowane operacje na modelach: 206:

Jaka jest różnica pomiędzy walidacją na poziomie pola modelu (przez np. validators) i metody modelu 'clean'?
  • 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