【问题标题】:Django Rest Framework pagination on GenericViewSetGenericViewSet 上的 Django Rest Framework 分页
【发布时间】:2016-09-14 11:06:30
【问题描述】:

我有以下 GenericViewSet,我正在尝试为视图集实现分页,这是我的视图集

class UserAccountViewSet(viewsets.GenericViewSet,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.DestroyModelMixin):
    queryset = UserAccount.objects.all()
    lookup_field = 'username'
    lookup_url_kwarg = "username"
    serializer_class = UserAccountSerializer
    page_size = 25
    page_size_query_param = 'page_size'
    max_page_size = 1000

    def list(self, request):
        queryset = self.queryset
        if request.GET.dict():
            return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

        serializer = UserListSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, **kwargs):
        pass

    def create(self, request, *args, **kwargs):
        pass

    def update(self, request, *args, **kwargs):
        pass

    def destroy(self, request, *args, **kwargs):
        pass

这是我的配置,

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '100/day'
    }
}

它没有分页,我怎样才能使分页与 DRF 一起工作?

谢谢。

【问题讨论】:

  • 你为什么只用一个 pass 语句覆盖 listretrieve 等函数?相反,您应该只使用 ModelViewSet 代替 GenericViewSet 而不使用所有这些功能。
  • 请看下面的链接,它可以帮助你。 stackoverflow.com/questions/31785966/…
  • @Deena 请添加您的list 方法的代码。
  • 你想用request.GET.dict()检查什么?
  • 没有调用负责分页的 DRF 代码。您应该在该行之后调用super()

标签: python django pagination django-rest-framework


【解决方案1】:

由于您覆盖 list() 方法并且没有返回分页响应,因此您的 API 中没有收到分页响应。相反,您应该在 list() 方法中调用 super(),因为 DRF 的 list() 方法本身会返回通用视图或视图集的分页响应。

只有在您使用泛型时自动执行分页 视图或视图集。如果您使用普通的APIView,则需要 自己调用分页 API 以确保您返回分页 回应。

class UserAccountViewSet(viewsets.GenericViewSet,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.DestroyModelMixin):

    def list(self, request, *args, **kwargs):
        if request.GET.dict():
            return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

        # call 'super()' to get the paginated response
        return super(UserAccountViewSet, self).list(request, *args, **kwargs)

【讨论】:

  • 它引发'super' object has no attribute 'list'
  • 您应该将mixins.ListModelMixin 添加到UserAccountViewSet 尽管我建议使用ModelViewSet 而不是所有的mixins 和GenericViewSet
  • 有特定的理由选择 GenericViewSet。
  • @Deena 好的。然后你应该将mixins.ListModelMixin 添加到UserAccountViewSet
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 2017-04-09
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2016-06-15
  • 2016-08-01
相关资源
最近更新 更多