Как получить «данные», а не «результаты» с Django Rest Framework ReadOnlyModelViewSet? - PullRequest
0 голосов
/ 09 мая 2018

Я прочитал этот вопрос Как сгенерировать атрибут данных JSON-API против атрибута результатов в JSON API Django Rest Framework? но принятый ответ не работает для меня, плюс у меня возникла проблема покрыты там.

Я использую Django Rest Framework (3.5.3) для предоставления конечной точки API. Эта конечная точка основана на

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Fruit.objects.all()
    serializer_class = FruitSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

Данные, возвращаемые оттуда, в порядке, за исключением того, что они имеют атрибут «results», а не «data».

Вопрос Я упоминал выше, предлагает вам сделать это

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Fruit.objects.all()
    serializer_class = FruitSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    renderer_classes = (JSONRenderer,)
    parser_classes = (JSONParser,)

но это не имеет значения для меня, и на самом деле у меня уже есть глобальные настройки, которые, как я считаю, охватывают аспекты рендеринга и синтаксического анализатора, подобные этому

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'PAGE_SIZE': 10,
    'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
    'DEFAULT_PAGINATION_CLASS':
        'rest_framework_json_api.pagination.PageNumberPagination',
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_json_api.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
        'rest_framework_json_api.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
}

Так что мне интересно знать, делал ли это кто-то недавно и как он это сделал?


Кстати, у меня есть другие конечные точки API, основанные на ModelViewSet, которые работают нормально и которые предоставляют атрибут «данные», а не «результаты» ... вот пример одной из этих

class TreeViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows Tree to be CRUDed.
    """
    queryset = Tree.objects.all()
    serializer_class = TreeSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        return Tree.objects.filter(username=self.request.user)

1 Ответ

0 голосов
/ 09 мая 2018

pagination.py

from collections import OrderedDict
from rest_framework.response import Response

class Pagination(PageNumberPagination):

    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('data', data)
        ]))

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':
        'path_to_pagination.pagination.Pagination',

}

, если вы хотите применить это только к классу FruitTestReadOnlyViewSet, не изменяйте settings.py и установите pagination_class для этого класса:

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = Pagination

изменит метод нумерации по умолчанию get_paginated_response с ('results', data) на ('data', data), все будет в порядке.

...