How to create custom JSON payload structure in Django Rest Framework?

I am creating an API that requires a custom structure for all JSON responses.

{
    code: 200,
    payload: [
        {...},
        {...},
        {...}
    ]
}

Where payloadcontains all the items returned by the request.

I created a custom Rendererone that extends JSONRenderer, but to access the response code I need to access render_context.

class VendorRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, render_context=None):
        response = render_context['response']
        data = {
            'code': response.status_code,
            'payload': data
        }
        return super(VendorRenderer, self).render(data, accepted_media_type, render_context)

Is this a suitable place for this kind of wrapping, or should it happen somewhere else, such as a ViewSet, or by extending the Response object?

+4
source share
1 answer

, .

, , , code, . , , .

, , , payload:

{
    "code":200,
    "payload": {
        "count": 20,
        "next": 2,
        "previous": 0,
        "results": [
            ...
        ]
    }
}

HTTP-.

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response 

class StandardResultsSetHeaderPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 1000

    def get_paginated_response(self, data):
        headers = {
            'X-Count':    self.page.paginator.count,
            'X-Next':     self.get_next_link(),
            'X-Previous': self.get_previous_link()
        }
        return Response(data, headers=headers)
+4

All Articles