首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django大型queryset返回作为响应有效

Django大型queryset返回作为响应有效
EN

Stack Overflow用户
提问于 2021-09-24 05:46:59
回答 1查看 796关注 0票数 0

我在django中有一个叫做"Sample“的模型,我想根据过滤器查询并返回大量行~100 k。然而,返回响应需要4到5秒的时间,我想知道我是否能让它更快。

(需要改进从queryset到df到响应json的转换。不向DB查询)

我的当前代码如下:

代码语言:javascript
复制
@api_view(['POST'])
def retrieve_signal_asset_weight_ts_by_signal(request):
    
    #code to get item.id here based on request

    qs = Sample.objects.filter(
        data_date__range=[start_date, end_date],
        item__id = item.id).values(*columns_required)

    df = pd.DataFrame(list(qs), columns=columns_required)    
    response = df .to_json(orient='records')

    return Response(response, status=status.HTTP_200_OK)

基于多个测试用例--我注意到慢的部分实际上不是从DB获取数据,而是将其转换为DataFrame,然后以JSON的形式返回。实际上这部分只需要2秒,df = pd.DataFrame(list(qs), columns=columns_required)。我正在寻找一种更快的方法来将queryset转换为json,我可以将其作为我的“响应”对象的一部分发送!

基于这个link,我尝试了其他方法,包括django-pandas和使用.values_list(),但它们似乎比这慢,而且我注意到许多答案都很古老,所以我想知道Django 3是否有什么东西可以使它更快。

谢谢

Django版本: 3.2.6

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-24 07:15:34

使用您的代码,您不能编写:

(需要改进从queryset到df到响应json的转换。不向DB查询)

实际上这部分花了大约2秒

df =pd.DataFrame(列表(Qs),columns=columns_required)

从数据库获取数据是一种延迟操作,因此只有在需要list(qs)数据时才会执行查询。根据文件:

QuerySets很懒--创建QuerySet的行为不涉及任何数据库活动。您可以一整天将过滤器堆叠在一起,而Django在计算QuerySet之前实际上不会运行查询。看一下这个例子:

试着分开操作:

代码语言:javascript
复制
records = list(qs)
df = pd.DataFrame(records, columns=columns_required))

现在,您可以确定哪个操作是耗时的。

也许,你看看StreamingHttpResponse

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69310106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档