有什么方法可以在 django Rest 框架中使用 objs = Model.objects.raw(sql) 和 PageNumberPagination 而不将 list(objs) 传递给分页

问题描述 投票:0回答:1

我目前在 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)
django django-rest-framework pagination
1个回答
0
投票

我认为你只是改变你如何调用分页,如果你的代码示例是准确的:

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}")
© www.soinside.com 2019 - 2024. All rights reserved.