【问题标题】:How i can wrap json response data for djago-rest-framework?我如何为 django-rest-framework 包装 json 响应数据?
【发布时间】:2021-10-11 10:16:21
【问题描述】:

我使用 djano rest 框架。我有模型、序列化器和视图:

class PictureModel(models.Model):
    id = models.AutoField(primary_key=True)
    url = models.CharField(max_length=256)


class PictureView(mixins.ListModelMixin, generics.GenericAPIView):
    serializer_class = PictureSerializer
    queryset = PictureModel.objects.all()

    def get(self, request):
        return self.list(request)


class PictureSerializer(serializers.ModelSerializer):
    class Meta:
        model = PictureModel
        fields = '__all__'

获取请求返回json:

[
  {
   "id": 120525, "url": "https://ddd.com/upload/iblock/579/5797cc881f8790926cee4a8fc790d1bd.JPG"
  },
  {
    "id": 120526, "url": "https://ddd.com/upload/iblock/382/382526e1deee07f60871430bd806aa71.JPG"
  }
  ...
 ]

但我需要将这些数据包装到

{
"success": 1, 
"data": [
     {
      "id": 120525, "url": "https://ddd.com/upload/iblock/579/5797cc881f8790926cee4a8fc790d1bd.JPG"
     },
     {
      "id": 120526, "url": "https://ddd.com/upload/iblock/382/382526e1deee07f60871430bd806aa71.JPG"
     }
     ...
 ]

我该怎么做?我可以使用中间件,但我不知道如何编辑响应数据。中间件适用于所有请求,但我不需要全部应用它。可能我可以使用我的渲染器,但我不知道如何使用。

附:我也使用 swagger 文档自动生成器。

2021 年 8 月 9 日更新: 我指定。我不喜欢修改get函数的方式,因为我有很多视图。

我想要下一个。鉴于我可以抛出异常,然后捕获它并返回 {'success': 0, 'data': None, 'message': exc.message}。如果无异常返回 {'success': 1, 'data': data}

我可以做

def get(self, request):
    try:
        # code
        return Response(data={'success': 1, 'data': data})
    except MyException as ex:
        return Response(data={'success': 0, 'data': None, 'message': exc.message})

但我不喜欢它。我尝试创建拥有的渲染类

class ApiRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
        if 'success' not in data:
            data = {
            'status': 1,
            'data': data
            }
        return super(ApiRenderer, self).render(data=data, accepted_media_type=accepted_media_type,
                                           renderer_context=renderer_context)

它有效。但是如果在我捕获它的地方抛出异常,并替换响应数据?

【问题讨论】:

    标签: django django-rest-framework django-views django-serializer


    【解决方案1】:

    我喜欢简单地思考。怎么样:

    def json_wrapper(status=True, data):
        wrapped = {}
        wrapped['status'] = 1 if status else 0
        wrapped['data'] = data  
        return wrapped
    
    
    

    使用类可以更灵活,但你明白了。

    【讨论】:

      【解决方案2】:

      首先,您不需要 id 作为 Django 中的字段,而是自动为您创建的。

      现在,让我们按照以下方式解决您的问题:

      class PictureView(mixins.ListModelMixin, generics.GenericAPIView):
          serializer_class = PictureSerializer
          queryset = PictureModel.objects.all()
      
          def list(self, request):
              response = super().list(request)
              return Response({"success": 1 if response.data else 0, "data": response.data})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2021-08-03
        • 2015-09-15
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        相关资源
        最近更新 更多