【问题标题】:Django REST Framework Nested Routers - Pagination not workingDjango REST Framework嵌套路由器 - 分页不起作用
【发布时间】:2023-03-15 16:31:01
【问题描述】:

我有一个使用drf-nested-routers 的简单嵌套路由器,类似于自述文件页面上的示例。嵌套路由上的列表视图根本不分页,忽略我的DEFAULT_PAGINATION_CLASS 设置。这是设计使然吗?嵌套路由是否必须手动实现分页?如果我尝试在嵌套视图集的 list 方法中调用 self.get_paginated_response,我会收到此错误:

AttributeError at /api/foo/13/bar/
'PageNumberPagination' object has no attribute 'page'

这是我的嵌套视图中的list 方法:

def list(self, request, workplan_pk=None):
        milestones = self.get_queryset()
        wp = get_object_or_404(Workplan, pk=workplan_pk)
        milestones = milestones.filter(workplan=wp)
        return Response(self.get_serializer_class()(milestones, many=True, context={'request': request}).data)

【问题讨论】:

  • 我的嵌套路由器分页工作正常,没有问题。分页由使用分页器的视图处理,视图对路由一无所知。他们只将请求作为参数获取。我认为问题出在其他地方。
  • 你能发布完整的堆栈跟踪吗?
  • @Ivan 你的嵌套路由器的list 方法返回什么?我的返回带有序列化数据的 DRF 响应对象。我想知道我是否应该返回其他东西。我已更新问题以显示我的 list 方法
  • 我的返回序列化的分页数据。在您的列表中,您根本不会对数据进行分页。我会发布一个答案。

标签: django pagination django-rest-framework django-queryset drf-nested-routers


【解决方案1】:

这与路由器无关。路由对视图是透明的,他们得到的唯一东西是Request 对象。

您可以像这样覆盖ModelViewSet.get_queryset()

class WorkplanMilestones(ModelViewSet):
    #...
    def get_queryset(self):
        wp = get_object_or_404(Workplan, pk=self.kwargs['workplan_pk'])
        return wp.milestones

我在这里假设url参数被称为workplan_pkmilestones是里程碑模型的反向关系。

这将返回工作计划的里程碑,其余部分(包括分页)由ModelViewSet 处理。

【讨论】:

  • 我知道这应该与路由器无关。另一方面,如果我的列表方法没有明确地对数据进行分页,那么分页会发生在哪里?我从 drf-nested-routers 文档了解到我必须覆盖 list,所以我不需要在那里显式分页吗?
  • 我会添加一个完整的例子。
  • @Neil 分页发生在list,所以如果你覆盖它,你还必须处理分页。如果你只覆盖get_querysetlist 会为你做分页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多