我已经阅读了这个问题How to generate JSON-API data attribute vs results attribute in Django Rest Framework JSON API?但是接受的答案对我不起作用,而且我的情况没有涉及。
我正在使用Django Rest Framework(3.5.3)来提供API端点。该终点基于
class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Fruit.objects.all()
serializer_class = FruitSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
从那里返回的数据很好,除了它有一个"结果"属性而不是数据"属性。
我上面提到的question建议你这样做
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',
}
所以我很想知道最近有人是否已经这样做过以及他们是如何做到的?
BTW我有其他基于ModelViewSet
的API端点可以正常工作并提供数据"属性而不是"结果" ......这里是其中一个
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)
答案 0 :(得分:4)
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)
即可。