Возврат сериализованного JSON из сериализатора DRF - PullRequest
1 голос
/ 19 июня 2020

У меня есть настраиваемый сериализатор, который возвращает строковое представление JSON. Этот сериализатор использует django.contrib.gis.serializers.geojson.Serializer, что намного быстрее, чем сериализатор DRF. Обратной стороной этого сериализатора является то, что он возвращает все, уже сериализованное в строку, а не как сериализуемый объект JSON.

Есть ли способ сократить строковый процесс DRF obj> json и просто передать строка как ответ json?

В настоящее время я делаю следующее, но строковый процесс obj> string> dict> не идеален:

from django.contrib.gis.serializers.geojson import Serializer
from json import loads

class GeoJSONFastSerializer(Serializer):
    def __init__(self, *args, **kwargs):
        self.instances = args[0]
        super().__init__()

    @property
    def data(self):
        # The use of json.loads here to deserialize the string,
        # only for it to be reserialized by DRF is inefficient.
        return loads(self.serialize(self.instances))

Что реализовано (упрощенное версия) в представлении:

from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import GenericViewSet

class GeoJSONPlaceViewSet(ListModelMixin, GenericViewSet):
    serializer_class = GeoJSONFastSerializer
    queryset = Places.objects.all()

1 Ответ

1 голос
/ 19 июня 2020

Я думаю, вы могли бы определить настраиваемый рендерер и просто передать данные, примерно так:

from django.utils.encoding import smart_unicode
from rest_framework import renderers


class AlreadyJSONRenderer(renderers.BaseRenderer):
    media_type = 'application/json'
    format = 'json'

    def render(self, data, media_type=None, renderer_context=None):
        return data

и просто добавить в представление

renderer_classes = [AlreadyJSONRenderer]
...