【问题标题】:Return serialized JSON from DRF Serializer从 DRF 序列化器返回序列化的 JSON
【发布时间】:2020-06-19 17:08:44
【问题描述】:

我有一个自定义序列化程序,它返回 JSON 的字符串表示形式。这个序列化器使用django.contrib.gis.serializers.geojson.Serializer,它比 DRF 序列化器快得多。这个序列化器的缺点是它返回所有已经序列化为字符串的东西,而不是作为 JSON 可序列化对象。

有没有一种方法可以简化 DRF obj>json 字符串处理,只将字符串作为 json 响应传递?

目前我在做以下,但是obj>string>dict>string的过程并不理想:

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()

【问题讨论】:

    标签: json django django-rest-framework geojson


    【解决方案1】:

    我认为您可以定义一个自定义渲染器并只传递数据,就像这样,

    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]
    

    【讨论】:

    • 你用这个让我很开心。谢谢!
    • 很高兴它对你有帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多