0

我在 django 中有一个名为“Sample”的模型,我想根据过滤器查询并返回大量行 ~ 100k。但是,返回响应最多需要 4-5 秒,我想知道是否可以让它更快。

(需要改进从查询集到 df 到响应 json 的转换。不从数据库查询)

我当前的代码如下所示:

@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)。我正在寻找一种更快的方法将查询集转换为 json,我可以将其作为“响应”对象的一部分发送!

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

谢谢

Django 版本:3.2.6

4

1 回答 1

1

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

(需要改进从查询集到 df 到响应 json 的转换。不从数据库查询)

这部分实际上大约需要 2 秒

df = pd.DataFrame(list(qs), columns=columns_required)

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

QuerySet 是惰性的——创建 QuerySet 的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,并且在评估 QuerySet 之前,Django 不会实际运行查询。看看这个例子:

尝试分开操作:

records = list(qs)
df = pd.DataFrame(records, columns=columns_required))

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

也许,你看看StreamingHttpResponse

于 2021-09-24T07:15:34.940 回答