Метод clean_fields
Метод clean_fields применяется к экземпляру модели
и выполняет валидацию каждого поля по отдельности.
Он проверяет, что значения полей соответствуют их типам
и ограничениям, таким как max_length, null,
blank, choices и другие. Метод вызывается
автоматически при сохранении модели через full_clean,
но может быть вызван и вручную для предварительной проверки.
При обнаружении ошибок валидации метод выбрасывает
исключение ValidationError.
Синтаксис
model_instance.clean_fields(exclude=None)
Параметры
Метод принимает один необязательный параметр:
exclude - список или кортеж имен полей,
которые не нужно проверять. Если параметр передан,
то указанные поля пропускаются при валидации.
Пример . Модель
Рассмотрим модель статьи с различными ограничениями:
from 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 для проверки:
from 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)
Результат выполнения кода:
{
"title": ["This field cannot be blank."],
"rating": ["Ensure this value is greater than or equal to 0."]
}
Пример
Теперь давайте проверим модель с корректными значениями:
from 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)
Результат выполнения кода:
"My First Article"
Пример
Используем параметр exclude для пропуска
проверки поля rating:
from 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)
Результат выполнения кода:
{
"title": ["This field cannot be blank."]
}
Пример
Рассмотрим более сложный пример с полем choices
и проверкой на длину:
from 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)
Результат выполнения кода:
{
"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,
который проверяет ограничения базы данных