【问题标题】:Combining ordering and pagination in Django在 Django 中结合排序和分页
【发布时间】:2021-09-22 15:00:06
【问题描述】:

我将 rest_framework.pagination.LimitOffsetPagination 与 Django 的排序过滤器结合使用(在我看来,filter_backends = [OrderingFilter] 和 ordering_fields)。问题是 Django 似乎在对分页结果应用排序,而不是相反。

类比列表:

如果 get_queryset 的结果是: ['b', 'e', 'c', 'a', 'd', 'f']

首先应用分页(例如,限制为 3): ['b', 'e', 'c']

然后对结果进行排序: ['b', 'c', 'e']

然而,我期望的结果是: ['a', 'b', 'c']

有什么想法可以在分页之前应用排序吗?

非常感谢您。

【问题讨论】:

  • 请添加一个示例,说明您如何编写视图。

标签: django django-pagination


【解决方案1】:

默认列表实现在分页之前应用过滤器,确保您没有覆盖list 并且没有调用super

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)

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

另外OrderingFilter 是一个奇怪的名字,因为过滤器不是为了排序,而是为了删除一些条目。确保您在查询集中订购:

class AbcViewSet(ViewSet):
   queryset = Cde.objects.filter(...).order_by("id")

【讨论】:

    猜你喜欢
    • 2013-05-29
    • 2019-08-21
    • 2018-12-12
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多