Django large queryset return 作为有效响应

Django large queryset return as response efficiently

我在 django 中有一个名为“Sample”的模型 我想查询 return 大量基于过滤器的行 ~ 100k。 但是,return 响应最多需要 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)

基于多个测试用例——我注意到缓慢的部分实际上并不是从数据库中获取数据,而是将其转换为 DataFrame,然后 returning 为 JSON . 这部分 df = pd.DataFrame(list(qs), columns=columns_required) 实际上需要大约 2 秒。我正在寻找一种将查询集转换为 json 的更快方法,我可以将其作为“响应”对象的一部分发送!

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

谢谢

Django 版本:3.2.6

用你的代码,你不能写:

(Need to improve converting from queryset to df to response json. Not querying from DB)

It's actually taking about 2 seconds just for this part

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

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

QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated. Take a look at this example:

尝试分开操作:

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

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

也许,你看看StreamingHttpResponse