Сериализаторы

Сериализацией называют процесс преобразования данных из одного формата в другой. Например, можно сериализовать экземпляр класса в объект JSON и обратно. Вместо JSON может выступать любой другой формат данных, но именно JSON является стандартом в индустрии и применяется в Django REST Framework по умолчанию.
Работа с запросами к API устроена так: программа-клиент отправляет запрос со списком параметров на определенный URL. API разбирает эти параметры и отдаёт клиенту запрошенную информацию. Разбор запроса и создание ответа происходит во view-функции или view-классе, написанных на Python. И для того, чтобы разобрать запрос и создать ответ — применяют классы-сериализаторы, переводчики с JSON на Python и обратно.
По принципу работы сериализаторы очень похожи на формы (Forms), с которыми вы уже имели дело: они переводят queryset'ы (списки объектов) или отдельные объекты модели в формат JSON и могут валидировать данные.
Сериализатор не только преобразует данные в JSON, но и указывает, какие поля включить в выдачу или исключить из неё.
Как и формы, сериализаторы могут быть связаны с моделями, но это не обязательно. Не связанные с моделями сериализаторы могут обрабатывать произвольные данные, например, объекты классов Python.
В коде это будет понять проще, чем в теоретическом описании.
Возьмём для примера класс Post, который описывает сущность публикации. У этого класса есть три поля — автор (для упрощения пусть это будет строка), текст и дата публикации. Чтобы в ответ на запрос к API вернуть структурированную информацию о записи, нужно сериализовать объект этого класса в формат JSON.
Создадим класс Post и опишем класс-сериализатор PostSerializer. А затем создадим экземпляр класса Post и передадим его в конструктор сериализатора. Теперь сериализованные данные хранятся в виде словаря в serializer.data
Скопировать кодPYTHON
from datetime import datetime from rest_framework import serializers class Post(): def __init__(self, author, text, pub_date=None): self.author = author self.text = text self.pub_date = pub_date or datetime.now() # создаём сериализатор, наследник предустановленного класса Serializer class PostSerializer(serializers.Serializer): author = serializers.CharField(max_length=200) text = serializers.CharField(max_length=5000) pub_date = serializers.DateTimeField() # создаём объект класса Post post = Post(author="Лев Толстой", text="17 Марта. Написалъ около листа Юности хорошо, но могъ бы написать больше и лучше. — И легъ поздно.") # передаём объект класса Post в сериализатор, чтобы превратить данные объекта в JSON serializer = PostSerializer(post) # смотрим, что получилось print(serializer.data) # будет напечатано: {"author": "Лев Толстой", "text": "Текст", "pub_date": "2020-03-23T18:02:33.123543Z"} # это же JSON!
Код сериализаторов обычно сохраняют в файле serializers.py.