Давай спробуємо почати з простого питання: як пояснити комп'ютеру, що об'єкти Python (наприклад, моделі Django або будь-які інші дані) потрібно представити у форматі, який "зрозуміє" фронтенд? Адже клієнтські додатки очікують JSON, а не звичні Python-об'єкти. Саме тут на допомогу приходить концепція серіалізації даних.
Серіалізація — це процес перетворення даних з одного формату в інший. Наприклад, зі складного Python-об'єкта у формат JSON, придатний для передачі через мережу. Але серіалізація — це дорога з двостороннім рухом! Після того, як дані прилетіли у форматі JSON від клієнта, нам потрібно їх розібрати і перетворити назад у зручні об'єкти Python.
Django REST Framework надає Serializer, який дозволяє автоматизувати цей процес. Це потужний інструмент, що спрощує роботу з даними в API.
Чому DRF-серіалізатори — це круто?
До того, як з'явилися такі фреймворки, як DRF, програмісти писали серіалізатори вручну. Уявіть, що вам потрібно написати купу коду на тему “якщо ключ name є в об'єкті, то робимо одне, інакше робимо інше". На щастя, тепер цей процес вже не такий виснажливий!
Переваги серіалізаторів DRF:
- Автоматизація: DRF бере на себе рутинну роботу з перетворення даних.
- Валідація даних: ви можете легко вказати правила для перевірки даних.
- Підтримка складних структур: створення вкладених структур та серіалізація відносин (наприклад, зв'язків ForeignKey, ManyToMany).
- Зручність та лаконічність: менше коду — більше функціональності!
Створення першого серіалізатора
Давайте створимо простий серіалізатор для нашого API. У попередніх лекціях ми припустимо, що створили модель Article, яка виглядає так:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.CharField(max_length=50)
published_at = models.DateTimeField(auto_now_add=True)
Тепер ми хочемо, щоб наші статті відправлялися клієнту у форматі JSON. Це завдання для Serializer!
Створіть файл serializers.py у папці вашого застосунку (якщо його ще немає):
from rest_framework import serializers
class ArticleSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
content = serializers.CharField()
author = serializers.CharField(max_length=50)
published_at = serializers.DateTimeField()
Зверніть увагу: ми визначили для кожного поля моделі потрібний тип. Тепер серіалізатор знає, які дані йому потрібно обробити.
Насправді, зробити серіалізацію простіше, ніж замовити піцу. Давайте спробуємо перетворити об'єкт Python у JSON:
from datetime import datetime
from serializers import ArticleSerializer
# Наші дані
article_data = {
"title": "Чому Python кращий, ніж ваша улюблена мова?",
"content": "Тому що так сказав Guido van Rossum!",
"author": "PyFan",
"published_at": datetime.now()
}
# Створюємо екземпляр серіалізатора
serializer = ArticleSerializer(data=article_data)
# Перевіряємо дані
if serializer.is_valid():
# Перетворюємо у JSON
print(serializer.data)
else:
print(serializer.errors)
Очікуваний результат:
{
"title": "Чому Python кращий, ніж ваша улюблена мова?",
"content": "Тому що так сказав Guido van Rossum!",
"author": "PyFan",
"published_at": "2023-10-10T10:00:00"
}
Серіалізатор сам подбав про перетворення об'єкта datetime у читабельний формат ISO 8601!
Десеріалізація: із JSON у Python
Давай уявимо, що фронтенд надіслав нам запит для створення нової статті. Її тіло виглядає наступним чином:
{
"title": "REST API: легко і просто",
"content": "Django REST Framework робить все за вас.",
"author": "Backend Ninja",
"published_at": "2023-10-10T15:00:00"
}
Тепер нам потрібно перетворити ці дані з JSON назад у Python-об'єкт.
Як це зробити? Використовуємо той самий серіалізатор:
from serializers import ArticleSerializer
# JSON представлення
json_data = {
"title": "REST API: легко і просто",
"content": "Django REST Framework робить все за вас.",
"author": "Backend Ninja",
"published_at": "2023-10-10T15:00:00"
}
# Створюємо серіалізатор з передачею даних
serializer = ArticleSerializer(data=json_data)
# Перевіряємо валідність даних
if serializer.is_valid():
# Дані пройшли валідацію, можемо використовувати їх
python_data = serializer.validated_data
print(python_data)
else:
print(serializer.errors)
Результат:
{
"title": "REST API: легко і просто",
"content": "Django REST Framework робить все за вас.",
"author": "Backend Ninja",
"published_at": datetime.datetime(2023, 10, 10, 15, 0)
}
Дані знову стали об'єктом Python, з яким зручно працювати!
Переваги вбудованої валідації
Давай додамо ще одну перевірку, щоб поле title не було порожнім. Для цього ми просто додамо параметр required=True у серіалізаторі:
class ArticleSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100, required=True)
content = serializers.CharField()
author = serializers.CharField(max_length=50)
published_at = serializers.DateTimeField()
Якщо фронтенд забуде вказати заголовок — серіалізатор видасть помилку:
{
"title": ["This field is required."]
}
Все, як бачиш, просто. І не потрібно додаткових перевірок у представленні.
Кастомізація серіалізатора
Хочеш більше контролю? Наприклад, ти хочеш перевизначити правила обробки та додавання даних? Просто перевизнач метод create() або validate() у своєму серіалізаторі.
Наведемо приклад кастомної валідації. Припустимо, ми хочемо заборонити заголовки з фразою “Python поганий”.
class ArticleSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
content = serializers.CharField()
author = serializers.CharField(max_length=50)
published_at = serializers.DateTimeField()
def validate_title(self, value):
if "Python поганий" in value:
raise serializers.ValidationError("Неможливо написати таку статтю. Python чудовий!")
return value
Якщо хтось спробує образити Python:
{
"title": "Чому Python поганий",
"content": "Я просто жартую.",
"author": "Троль",
"published_at": "2024-10-10T15:00:00"
}
Ми отримаємо:
{
"title": ["Неможливо написати таку статтю. Python чудовий!"]
}
З таким серіалізатором честь Python у безпеці!
Коли це може знадобитися?
Тепер ти розумієш, як серіалізатори спрощують роботу з даними в REST API. Використання серіалізаторів — це обов’язковий етап на шляху до створення реальних застосунків:
- На співбесіді тебе можуть запитати про твою реалізацію REST API. Уміння працювати з серіалізаторами продемонструє твій професіоналізм.
- У реальних проєктах серіалізатори DRF дозволяють зекономити час на валідації та обробці даних.
- Вони забезпечують безпеку, гарантуючи, що дані відповідають заданим правилам.
Для отримання додаткових прикладів і способів використання серіалізаторів відвідай офіційну документацію DRF.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ