没有模型 APIView 的 DRF 分页自定义响应

Posted

技术标签:

【中文标题】没有模型 APIView 的 DRF 分页自定义响应【英文标题】:DRF Pagination custom response without model APIView 【发布时间】:2021-11-25 19:31:55 【问题描述】:

您好,我在 Django 中有一个项目,它对不同的数据库执行多个查询,并在多个端点返回它们,为此我使用 Pandas 和 DRF (APIViews)。

当响应很长并且逻辑上服务器内存不足时会出现问题,我知道我需要对结果进行分页但我没有找到方法,因为我不使用模型或序列化程序,我使用 pandas 进行原始查询以进行查询。

有没有办法按照我的方式对结果进行分页?

我留下了一些我的代码的 sn-ps。

class AffiliateAPIView(APIView):
    permission_classes = (IsAuthenticated,)  
    def get(self, request):
        insurance = self.request.query_params.get('insurance', None)
        emergensys_df = pd.read_sql_query(general_attention(insurance), engine())
        return Response(emergensys_df.to_dict(orient='records'))

【问题讨论】:

This 可能会有所帮助 【参考方案1】:

您应该实现流式响应。 Django为此提供StreamingHttpResponse:https://docs.djangoproject.com/en/3.2/ref/request-response/#streaminghttpresponse-objects 基本上,您应该执行以下操作:

创建一个生成器,它使用LIMITOFFSET SQL 运算符按块从数据库中获取数据,对其进行处理,然后按块返回。 创建并返回StreamingHttpResponse 并将生成器传递给它,例如:return StreamingHttpResponse(your_generator)

【讨论】:

以上是关于没有模型 APIView 的 DRF 分页自定义响应的主要内容,如果未能解决你的问题,请参考以下文章

RESTFramework(DRF)进阶篇(APIView类)

RESTFramework(DRF)进阶篇(APIView类)

drf-分页

DRF部分源码分析——APIView

Django框架深入了解_04(DRF之url控制解析器响应器版本控制分页)

Laravel 5.2 分页自定义