Преобразование словаря python в json-типы в django rest framework

Это скорее вопрос понимания, чем вопрос кода. Я использую DRF уже год. Когда я узнал о сериализаторах, там говорится о двух шагах.

Для запроса get что делает класс сериализатора:

  1. Converting complex datatypes like queryset into python datatype like the dictionary.
  2. Converting dictionary into json format which is sent to the api as response.

Я использую команды print, чтобы увидеть все, что происходит, или использую оболочку. Я вижу, как происходит первый шаг, т.е. я вижу сложный набор запросов и после сериализации могу видеть словарь набора запросов. Но нигде в коде я не могу увидеть, как происходит второй шаг. Хотя формат json не сильно отличается от словаря python. Единственное отличие, которое я вижу, это двойные кавычки вместо одинарных в json. Но все же преобразование должно произойти. Происходит ли оно автоматически или я что-то упустил?

Мой фрагмент:

enter image description here

Мои отпечатки кверисета и сериализованных данных:

enter image description here

Здесь напечатанный email является сложными данными. После сериализации он преобразуется в словарь python. Однако данные JSON, поступающие в postman, выглядят следующим образом.

enter image description here

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

Вернуться на верх