【问题标题】:How to paginate external API in Django Rest Framework如何在 Django Rest Framework 中对外部 API 进行分页
【发布时间】:2019-08-23 15:03:52
【问题描述】:

我正在学习使用 Django Rest Framework,因此作为练习,我想使用 Github User REST API 列出用户并将特定用户信息保存在本地数据库中,我还希望该列表可以分页。我有以下视图集文件:

import requests
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from users.models import User
from .serializers import UserSerializer


class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @action(detail=False, methods=['GET'])
    def github(self, request):
        data = requests.get('https://api.github.com/users')
        return Response(data=data.json())

我能够列出我的用户,并且我知道如何对查询集进行分页,但如何对 github 响应进行分页?

另一个问题,在这个 sn-p 中,我的路线如下:

api/用户

api/user/github

​

有没有办法为 github 创建一个单独的视图,所以我可以这样:

api/用户

api/github/用户

api/github/存储库

​

然后能够在 api/user 和 api/github/user 上使用过滤器字段。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你需要使用自定义分页:

    import requests
    from rest_framework.decorators import action
    from rest_framework.response import Response
    from rest_framework.viewsets import ModelViewSet
    from users.models import User
    from .serializers import UserSerializer
    from rest_framework import status
    from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
    
    
    class UserViewSet(ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        @action(detail=False, methods=['GET'])
        def github(self, request):
            limit = self.request.query_params.get("limit", 10)
            offset = self.request.query_params.get("offset", 1)
            users = requests.get('https://api.github.com/users')
            results = users.json()
    
            try:
                paginator = Paginator(results, limit)
            except:
                paginator = Paginator(results, limit)
    
            try:
                results = paginator.page(offset)
            except PageNotAnInteger:
                results = paginator.page(offset)
            except EmptyPage:
                results = []
    
            api_count = paginator.count
            api_next = None if not results.has_next() else results.next_page_number()
            api_previous = None if not results.has_previous() else results.previous_page_number()
    
            data = {
                'count': api_count,
                'next': api_next,
                'previous': api_previous,
                'results': list(results)
            }
    
            return Response(data, status=status.HTTP_200_OK)
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 2015-05-18
      • 2018-11-24
      • 2021-07-12
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多