我目前在 Django 中使用原始 SQL 查询时面临分页挑战。当我需要在查询的 LEFT OUTER JOIN 中应用额外的过滤器时,就会出现这种情况,我发现 Django 的 ORM 并不直接支持该过滤器。尽管尝试使用 FilteredRelation,我意识到它并不能完全满足我的要求。
作为一种解决方法,我选择使用原始 SQL 查询,这使我能够实现所需的过滤器。然而,我在尝试对结果进行分页时遇到了障碍。原始查询集似乎不支持开箱即用的分页。
以下是相关代码片段:
queryset = CheckTraModelTotal.objects.raw(sql_query)
page = RawQuerySetPaginator(queryset, 15)
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
我认为你只是改变你如何调用分页,如果你的代码示例是准确的:
page = RawQuerySetPaginator(queryset, 15)
分页对于大多数原始查询应该没有问题。订购和搜索当然是一个问题。
class MyPagination(PageNumberPagination):
page_size = 1
qs = User.objects.raw("select email from user order by id desc")
paginator = MyPagination()
# page is a list of user objects here
page = paginator.paginate_queryset(qs, request=req)
# generate the list of dict objects for output
serialized_data = UserSerializer(page, many=True).data
# convert to a response, and add the next/prev/count links
output = paginator.get_paginated_response(serialized_data)
分页器很令人困惑,因为它们内部使用 django 分页器,因此有一个页面,其中有一个分页器,它执行
.count
的操作。我不知道这是怎么做到的,这很神奇。 RawQuerySet
没有 count()
方法,但这仍然有效。
print(f"total records => {paginator.page.paginator.count}")