Сериализаторы
Сериализацией называют процесс преобразования данных из одного формата в другой. Например, можно сериализовать экземпляр класса в объект 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()
class PostSerializer(serializers.Serializer):
author = serializers.CharField(max_length=200)
text = serializers.CharField(max_length=5000)
pub_date = serializers.DateTimeField()
post = Post(author="Лев Толстой", text="17 Марта. Написалъ около листа Юности хорошо, но могъ бы написать больше и лучше. — И легъ поздно.")
serializer = PostSerializer(post)
print(serializer.data)
Код сериализаторов обычно сохраняют в файле serializers.py.