JavaRush /Курси /Модуль 3: Django /Використання Serializer для перетворення даних

Використання Serializer для перетворення даних

Модуль 3: Django
Рівень 16 , Лекція 4
Відкрита

Давай спробуємо почати з простого питання: як пояснити комп'ютеру, що об'єкти Python (наприклад, моделі Django або будь-які інші дані) потрібно представити у форматі, який "зрозуміє" фронтенд? Адже клієнтські додатки очікують JSON, а не звичні Python-об'єкти. Саме тут на допомогу приходить концепція серіалізації даних.

Серіалізація — це процес перетворення даних з одного формату в інший. Наприклад, зі складного Python-об'єкта у формат JSON, придатний для передачі через мережу. Але серіалізація — це дорога з двостороннім рухом! Після того, як дані прилетіли у форматі JSON від клієнта, нам потрібно їх розібрати і перетворити назад у зручні об'єкти Python.

Django REST Framework надає Serializer, який дозволяє автоматизувати цей процес. Це потужний інструмент, що спрощує роботу з даними в API.

Чому DRF-серіалізатори — це круто?

До того, як з'явилися такі фреймворки, як DRF, програмісти писали серіалізатори вручну. Уявіть, що вам потрібно написати купу коду на тему “якщо ключ name є в об'єкті, то робимо одне, інакше робимо інше". На щастя, тепер цей процес вже не такий виснажливий!

Переваги серіалізаторів DRF:

  1. Автоматизація: DRF бере на себе рутинну роботу з перетворення даних.
  2. Валідація даних: ви можете легко вказати правила для перевірки даних.
  3. Підтримка складних структур: створення вкладених структур та серіалізація відносин (наприклад, зв'язків ForeignKey, ManyToMany).
  4. Зручність та лаконічність: менше коду — більше функціональності!

Створення першого серіалізатора

Давайте створимо простий серіалізатор для нашого 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. Використання серіалізаторів — це обов’язковий етап на шляху до створення реальних застосунків:

  1. На співбесіді тебе можуть запитати про твою реалізацію REST API. Уміння працювати з серіалізаторами продемонструє твій професіоналізм.
  2. У реальних проєктах серіалізатори DRF дозволяють зекономити час на валідації та обробці даних.
  3. Вони забезпечують безпеку, гарантуючи, що дані відповідають заданим правилам.

Для отримання додаткових прикладів і способів використання серіалізаторів відвідай офіційну документацію DRF.

3
Опитування
Встановлення DRF та налаштування проєкту, рівень 16, лекція 4
Недоступний
Встановлення DRF та налаштування проєкту
Встановлення DRF та налаштування проєкту
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ