简体   繁体   English

django-rest-framework,如何分页

[英]django-rest-framework, how to paginate

This is my view witch works ok: 这是我的观点,女巫行得通:

from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import serializers
from gamerauntsia.berriak.serializers import BerriaSerializer
from rest_framework.response import Response
import json



class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

@csrf_exempt
def app_berria_list(request):
    if request.method == 'GET':
        berriak = Berria.objects.all()
        serializer = BerriaSerializer(berriak, many=True)
        return JSONResponse(serializer.data)

I want the response paginated by 5 items, so I tried adding this in settings.py: 我希望响应由5个项目分页,因此我尝试将其添加到settings.py中:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 5
}

Do I need to change something more to make it work? 我是否需要更改其他内容才能使其正常工作? Thanks in advance 提前致谢

Serializers don't paginate by themselves, you have to call the pagination class with the queryset as an argument. 序列化程序本身不会分页,您必须使用queryset作为参数来调用分页类。 The built-in rest_framework.viewsets.ModelViewSet will do both the JSON parsing/rendering and pagination by default without you having to do anything. 内置的rest_framework.viewsets.ModelViewSet默认情况下将执行JSON解析/渲染和分页,而无需执行任何操作。

Why not have a viewset class such as: 为什么没有viewset类,例如:

from rest_framework import viewsets
class BerriaViewSet(viewsets.ModelViewSet):
    queryset = Berria.objects.all()
    serializer_class = BerriaSerializer

This will do everything you want I believe. 我相信这会做您想要的一切。

If you insist on doing it the way you are, however, you can do the following: 但是,如果您坚持按原样进行操作,则可以执行以下操作:

from rest_framework.pagination import PageNumberPagination
@csrf_exempt
def app_berria_list(request):
    if request.method == 'GET':
        berriak = Berria.objects.all()
        paginator = PageNumberPagination()
        page = paginator.paginate_queryset(berriak, request)
        serializer = BerriaSerializer(page, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM