JavaRush /Курси /Модуль 3: Django /Створення простого Serializer

Створення простого Serializer

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

Сьогодні ми розглянемо ключовий компонент DRF — Serializer. Це базовий інструмент для серіалізації даних, який дозволяє конвертувати їх у формат JSON, а також виконувати зворотний процес — десеріалізацію.

Вступ до серіалізаторів

Давайте почнемо з визначення. Serializer в Django REST Framework — це місток між вашими моделями Django (або будь-якими іншими даними) та форматами, придатними для передачі через API, наприклад, JSON. Якщо уявити серіалізатор як перекладача між клієнтом і вашим сервером, це буде досить точне порівняння.

Клієнт говорить мовою JSON, а сервер спілкується мовою Python-об'єктів. Serializer забезпечує переклад в обох напрямках: з Python-об'єктів у JSON (сериалізація) та з JSON у Python-об'єкти (десериалізація). Без серіалізаторів дані у вашому API виглядали б як безглуздий сміття.

Навіщо потрібні серіалізатори?

Коли ваш бекенд хоче відправити дані, наприклад список користувачів або постів блогу, він має перетворити ці дані у формат, який клієнт зможе зрозуміти, тобто JSON. І навпаки, при отриманні даних від клієнта, наприклад форми реєстрації, вони мають бути перетворені з JSON у Python-об'єкти. Усе це роблять серіалізатори.

Цікавий факт:

більшість серіалізаторів у DRF працюють дуже схоже на форми Django. Насправді, DRF Serializers натхненні Django Forms, що робить їх такими потужними.

Основи створення серіалізатора

Серіалізатори у DRF базуються на класі Serializer (запишіть це ім'я, воно часто з'являтиметься у наших прикладах). Цей клас надає спосіб опису даних, які ми збираємось серіалізувати або десеріалізувати.

Ось базовий приклад, щоб розігрітися:

from rest_framework import serializers

class SampleSerializer(serializers.Serializer):
    field1 = serializers.CharField(max_length=100)
    field2 = serializers.IntegerField()

Тут ми визначили серіалізатор з двома полями: field1 (строка з максимальною довжиною 100 символів) та field2 (ціле число). Виглядає просто, правда?

Приклад створення простого Serializer

Настав час попрацювати з реальним прикладом. Давайте уявимо, що ми створюємо API для блогу, і нам потрібно надсилати інформацію про пост клієнту.

Крок 1: модель даних

Спочатку створимо Django-модель для нашого блогу:

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

Ця модель описує пост блогу з чотирма полями: заголовком, контентом, автором і часом створення.

Крок 2: створення серіалізатора

Тепер давайте створимо серіалізатор для цієї моделі:

from rest_framework import serializers

class BlogPostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()
    author = serializers.CharField(max_length=50)
    created_at = serializers.DateTimeField()

Кожне поле у серіалізаторі відповідає полю моделі. Круто, правда? Давайте розберемо це більш детально, щоб розвіяти магію:

  • CharField: використовується для текстових даних. Ми можемо вказати обмеження, такі як max_length.
  • DateTimeField: використовується для серіалізації та десеріалізації дати і часу.

Крок 3: приклад використання

Тепер подивимось, як використовувати наш серіалізатор на практиці.

Припустимо, у нас є об'єкт BlogPost:

from datetime import datetime

post = {
    "title": "Привіт, Django!",
    "content": "Django REST Framework дуже крутий.",
    "author": "Admin",
    "created_at": datetime.now()
}

Ми хочемо перетворити цей об'єкт у JSON. Ось як це робиться:

# Створюємо об'єкт серіалізатора з нашими даними
serializer = BlogPostSerializer(post)

# Вивід серіалізованих даних
print(serializer.data)

Результат виглядатиме так (зверніть увагу, як красиво все форматовано):

{
    "title": "Привіт, Django!",
    "content": "Django REST Framework дуже крутий.",
    "author": "Admin",
    "created_at": "2023-10-05T12:34:56.789"
}

Десеріалізація (з JSON в Python)

Тепер уявімо, що клієнт надіслав нам JSON із даними нового поста. Нам потрібно перетворити його в Python-об'єкт:

data = {
    "title": "Новий пост",
    "content": "Це контент нового поста.",
    "author": "User",
    "created_at": "2023-10-05T12:34:56.789"
}

# Створюємо об'єкт серіалізатора з вхідними даними
serializer = BlogPostSerializer(data=data)

# Перевіряємо, чи валідні дані
if serializer.is_valid():
    # Доступ до валідованих даних
    print(serializer.validated_data)
else:
    # Обробка помилок
    print(serializer.errors)

Тут відбувається кілька цікавих речей:

  1. Ми передали data в серіалізатор.
  2. Перевірили валідність даних за допомогою методу is_valid().
  3. Якщо дані коректні, отримали доступ до них через validated_data. Якщо ні, можемо побачити помилки у errors.

Типові помилки

Коли ви починаєте працювати з серіалізаторами, є кілька типових помилок, з якими ви можете зіткнутися:

  1. Пропуск полів даних. Якщо клієнт пропустить одне з обов'язкових полів, ви отримаєте помилку. Це легко обійти, додавши параметр required=False у поле серіалізатора, щоб зробити його необов'язковим.

  2. Невірний формат даних. Наприклад, якщо клієнт надсилає текст замість числа. DRF автоматично валідирує дані, тож це не велика проблема, але важливо пам'ятати, що ваші дані мають відповідати специфікації.

  3. Зайві поля. Якщо клієнт надсилає дані з додатковими полями, які не визначені в серіалізаторі, вони просто ігноруються. Це стандартна поведінка DRF.

Переваги DRF Serializer

Чому варто використовувати серіалізатори DRF, а не писати свою серіалізацію? Ось кілька причин:

  • Економія часу. DRF бере на себе всю "брудну" роботу.
  • Автоматична валідація. Ви забудете, як вручну перевіряти дані.
  • Легкість розширення. Ви можете легко додавати нові поля або змінювати логіку перетворення даних.

Висновок

Тепер у вас є основи, щоб почати експериментувати! Спробуйте створити свої власні серіалізатори для інших моделей, щоб закріпити матеріал. Як кажуть у світі програмістів: "Кожен код краще пояснюється на практиці!"

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ