Преобразование словаря python в json-типы в django rest framework
Это скорее вопрос понимания, чем вопрос кода. Я использую DRF уже год. Когда я узнал о сериализаторах, там говорится о двух шагах.
Для запроса get что делает класс сериализатора:
- Converting complex datatypes like queryset into python datatype like the dictionary.
- Converting dictionary into json format which is sent to the api as response.
Я использую команды print, чтобы увидеть все, что происходит, или использую оболочку. Я вижу, как происходит первый шаг, т.е. я вижу сложный набор запросов и после сериализации могу видеть словарь набора запросов. Но нигде в коде я не могу увидеть, как происходит второй шаг. Хотя формат json не сильно отличается от словаря python. Единственное отличие, которое я вижу, это двойные кавычки вместо одинарных в json. Но все же преобразование должно произойти. Происходит ли оно автоматически или я что-то упустил?
Мой фрагмент:
Мои отпечатки кверисета и сериализованных данных:
Здесь напечатанный email является сложными данными. После сериализации он преобразуется в словарь python. Однако данные JSON, поступающие в postman, выглядят следующим образом.
Serializer.data
дает вам экземпляр rest_framework.utils.serializer_helpers.ReturnDict
, который является просто легкой оберткой вокруг OrderedDict
. OrderedDict
является дальнейшим расширением Python's dict
, специализированным для поддержания порядка вставки ключей. Поскольку JSON - это текстовый формат передачи данных, экземпляр OrderedDict
, соответствующий сериализатору, сначала строится, а затем отправляется. Поскольку JSON является стандартизированным форматом, браузер способен разобрать строковое представление и красиво распечатать его.
Этим занимается класс Response.
<<<Класс Response
принимает неразобранные, сериализованные данные ответа и код состояния в качестве аргумента. Если вы посмотрите на реализацию, она выбирает классы рендеринга на основе accepted_media_type
. По умолчанию django поддерживает следующие рендеры по умолчанию.
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ] }
В вашем случае django использует JSONRenderer
класс , который имеет render
метод , который выполняет фактическую сериализацию в JSON