Метод clean_fields

Метод clean_fields применяется к экземпляру модели и выполняет валидацию каждого поля по отдельности. Он проверяет, что значения полей соответствуют их типам и ограничениям, таким как max_length, null, blank, choices и другие. Метод вызывается автоматически при сохранении модели через full_clean, но может быть вызван и вручную для предварительной проверки. При обнаружении ошибок валидации метод выбрасывает исключение ValidationError.

Синтаксис

pythonmodel_instance.clean_fields(exclude=None)

Параметры

Метод принимает один необязательный параметр:

exclude - список или кортеж имен полей, которые не нужно проверять. Если параметр передан, то указанные поля пропускаются при валидации.

Пример . Модель

Рассмотрим модель статьи с различными ограничениями:

pythonfrom django.db import models
from django.core.exceptions import ValidationError

class Article(models.Model):
  title = models.CharField(max_length=200, null=False, blank=False)
  content = models.TextField(null=True, blank=True)
  rating = models.IntegerField(null=False, default=0)
  is_published = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return self.title

Пример

Давайте создадим экземпляр модели с невалидными данными и вызовем clean_fields для проверки:

pythonfrom myapp.models import Article
from django.core.exceptions import ValidationError

article = Article(
  title="",  # Пустое значение, нарушает null=False и blank=False
  rating=-5,  # Отрицательное значение
  is_published=True
)

try:
  article.clean_fields()
except ValidationError as e:
  print(e.message_dict)

Результат выполнения кода:

python{
  "title": ["This field cannot be blank."],
  "rating": ["Ensure this value is greater than or equal to 0."]
}

Пример

Теперь давайте проверим модель с корректными значениями:

pythonfrom myapp.models import Article

article = Article(
  title="My First Article",
  content="This is some content.",
  rating=10,
  is_published=True
)

try:
  article.clean_fields()
  print(article.title)
except ValidationError as e:
  print(e.message_dict)

Результат выполнения кода:

python"My First Article"

Пример

Используем параметр exclude для пропуска проверки поля rating:

pythonfrom myapp.models import Article
from django.core.exceptions import ValidationError

article = Article(
  title="",
  rating=-5,
  is_published=True
)

try:
  article.clean_fields(exclude=["rating"])
except ValidationError as e:
  print(e.message_dict)

Результат выполнения кода:

python{
  "title": ["This field cannot be blank."]
}

Пример

Рассмотрим более сложный пример с полем choices и проверкой на длину:

pythonfrom django.db import models
from django.core.exceptions import ValidationError

class Category(models.Model):
  STATUS_CHOICES = [
    ("draft", "Draft"),
    ("published", "Published"),
  ]

  name = models.CharField(max_length=50, null=False, blank=False)
  status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="draft")

  def __str__(self):
    return self.name

category = Category(
  name="A very long category name that exceeds the max length limit",
  status="archived"
)

try:
  category.clean_fields()
except ValidationError as e:
  print(e.message_dict)

Результат выполнения кода:

python{
  "name": ["Ensure this value has at most 50 characters (it has 63)."],
  "status": ["Value 'archived' is not a valid choice."]
}

Смотрите также

  • метод clean,
    который выполняет кросс-полевую валидацию модели
  • метод full_clean,
    который выполняет полную проверку модели
  • метод validate_unique,
    который проверяет уникальность полей модели
  • метод validate_constraints,
    который проверяет ограничения базы данных