2016-10-18 101 views
3

我想添加分頁到我的項目中,找不到任何明確的文檔或教程。Django其餘框架分頁與自定義API視圖

我有辦事處

型號列表 Office.py

class Office(Model): 
    name = CharField(_("name"), default=None, max_length=255, null=True) 
    email = EmailField(_("email"), default=None, max_length=255, null=True) 
    description = TextField(_("description"), default=None, null=True) 

串行

class OfficeSerializer(ModelSerializer): 
    id = IntegerField(read_only=True) 
    name = CharField(read_only=True) 
    email = URLField(read_only=True) 
    description = CharField(read_only=True) 

class Meta: 
    model = Office 
    fields = ("id", "name", "email", "description") 

views.py

@api_view(["GET"]) 
@permission_classes((AllowAny,)) 
def offices(request): 
    instance = Office.objects.filter()[:10] 
    serializer = OfficeSerializer(instance, many=True) 

    return Response(serializer.data) 

任何有R幫助使用分頁調整Office列表?

+0

你不能得到比[Django的分頁教程]更清晰(https://docs.djangoproject.com /en/1.9/topics/pagination /)... – brianpck

+0

不適用於Django休息@brianpck – Nart

回答

8

http://www.django-rest-framework.org/api-guide/pagination/

只有在使用通用 視圖或查看集時,纔會自動執行分頁。如果您使用的是常規APIView,則需要自行調用 調用API,以確保您返回分頁 響應。查看mixins.ListModelMixin和 generics.GenericAPIView類的源代碼示例。

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py#L35 https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/generics.py#L166

所以我建議是這樣的:

@api_view(["GET"]) 
@permission_classes((AllowAny,)) 
def offices(request): 
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS 
    paginator = pagination_class() 
    queryset = Office.objects.all() 
    page = paginator.paginate_queryset(queryset, request) 

    serializer = OfficeSerializer(page, many=True) 

    return paginator.get_paginated_response(serializer.data) 
+0

謝謝你!完美的作品 – Nart

0

http://www.django-rest-framework.org/api-guide/pagination/

GET https://api.example.org/accounts/?limit=100&offset=400 

響應:

HTTP 200 OK 
{ 
    "count": 1023 
    "next": "https://api.example.org/accounts/?limit=100&offset=500", 
    "previous": "https://api.example.org/accounts/?limit=100&offset=300", 
    "results": [ 
     … 
    ] 
} 

實施例的settings.py

REST_FRAMEWORK = { 
    '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': (
     'rest_framework_json_api.renderers.JSONRenderer', 
     'rest_framework.renderers.BrowsableAPIRenderer', 
    ) 
} 
+0

我看到了這一點,在setting.py中添加2行代碼不起作用 – Nart

+0

它應該工作。不過,我會發佈一個不同的例子。 – mk2