我在django中有一个叫做"Sample“的模型,我想根据过滤器查询并返回大量行~100 k。然而,返回响应需要4到5秒的时间,我想知道我是否能让它更快。
(需要改进从queryset到df到响应json的转换。不向DB查询)
我的当前代码如下:
@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
发布于 2021-09-24 07:15:34
使用您的代码,您不能编写:
(需要改进从queryset到df到响应json的转换。不向DB查询)
实际上这部分花了大约2秒
df =pd.DataFrame(列表(Qs),columns=columns_required)
从数据库获取数据是一种延迟操作,因此只有在需要list(qs)数据时才会执行查询。根据文件:
QuerySets很懒--创建QuerySet的行为不涉及任何数据库活动。您可以一整天将过滤器堆叠在一起,而Django在计算QuerySet之前实际上不会运行查询。看一下这个例子:
试着分开操作:
records = list(qs)
df = pd.DataFrame(records, columns=columns_required))现在,您可以确定哪个操作是耗时的。
也许,你看看StreamingHttpResponse
https://stackoverflow.com/questions/69310106
复制相似问题