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.

1
Задача
Модуль 3: Django, 16 уровень, 4 лекция
Недоступна
Создание простого сериализатора
Создание простого сериализатора
1
Задача
Модуль 3: Django, 16 уровень, 4 лекция
Недоступна
Преобразование объекта в JSON
Преобразование объекта в JSON
3
Опрос
Установка DRF и настройка проекта, 16 уровень, 4 лекция
Недоступен
Установка DRF и настройка проекта
Установка DRF и настройка проекта
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ