如何在多queryset django中提高分页性能?

如何在多queryset django中提高分页性能?,django,django-rest-framework,django-serializer,django-pagination,Django,Django Rest Framework,Django Serializer,Django Pagination,我有两个查询集: queryset_primary = PrimaryUserSerializer(FileUpload.objects.all().order_by('name'), many=True, context=context).data queryset_secondary = MemberSerializer(Members.objects.all().order_by('member_name'), many=True, context=context).data 两个都有不

我有两个查询集:

queryset_primary = PrimaryUserSerializer(FileUpload.objects.all().order_by('name'), many=True, context=context).data
queryset_secondary = MemberSerializer(Members.objects.all().order_by('member_name'), many=True, context=context).data
两个都有不同的键。因此我迭代了两个查询集:

    response = []
    for primary in queryset_primary:
        # name_pri=primary['primary_user_id']
        new_data={ 
            'user_id' : primary['primary_user_id'],
            'name': primary['name'],
        }
        response.append(new_data)

    for secondary in queryset_secondary:
        new_data={
            'user_id' : secondary['secondary_user_id'],
            'name': secondary['member_name'],
        }
我再次使用了一个具有类似键的公共序列化程序进行分页:

    responses = self.paginate_queryset(response)
    if responses is not None:
        serializer = CommonUserSerializer(responses,many=True)
        data = {
            'code': 200,
            'status': "OK",
        }
        page_nated_data = self.get_paginated_response(serializer.data).data
        data.update(page_nated_data)
        data['response'] = data.pop('results')
        return Response(data)
总共需要8秒的加载时间


如何减少API加载时间?

在公开大容量数据时,应尽可能避免使用模型和序列化程序。查看Django的ORM.values()选项以进行特定的选择。尝试构建自己的json序列化结构。我还避免在结构中嵌入嵌套数据(尤其是在列表视图中)。让客户端调用两次或过滤api然后立即返回“完整”数据可能会便宜得多


您是否尝试分析特定的api调用?Django的调试工具栏是一个方便的工具,可以锁定瓶颈。

查看ORM中的
.values()

这将为您提供一个查询集,当用作iterable时,该查询集将返回字典,而不是模型实例

您可以将此功能与以下功能结合使用:

from django.http import JsonResponse

def some_view(request):
    data = list(Members.objects.all().order_by('member_name').values()) # Use list(), because QuerySet is not JSON serializable by default!
    return JsonResponse(data, safe=False)
具体到你的问题:

from rest_framework import status
from rest_framework.response import Response

def some_view(request):
    merged = []

    merged.append(
        list(Members.objects.all().order_by('member_name').values('user_id'. 'name')) + list(FileUpload.objects.all().order_by('name').values('user_id'. 'name'))
    )

    responses = self.paginate_queryset(merged)
    if responses is not None:
        serializer = CommonUserSerializer(responses, many=True)

        data = {
            'success': true,
        }
        paginated_data = self.get_paginated_response(serializer.data).data
        data.update(paginated_data)
        data['response'] = data.pop('results')
        return Response(data, status=status.HTTP_200_OK)
您还需要执行一些
annotations()
来将
user\u id
属性设置为
primary\u user\u id
secondary\u user\u id


效率更高

嗨,Jisha,希望我的回答能帮助你提高API的效率,让我知道你进展如何。
from rest_framework import status
from rest_framework.response import Response

def some_view(request):
    merged = []

    merged.append(
        list(Members.objects.all().order_by('member_name').values('user_id'. 'name')) + list(FileUpload.objects.all().order_by('name').values('user_id'. 'name'))
    )

    responses = self.paginate_queryset(merged)
    if responses is not None:
        serializer = CommonUserSerializer(responses, many=True)

        data = {
            'success': true,
        }
        paginated_data = self.get_paginated_response(serializer.data).data
        data.update(paginated_data)
        data['response'] = data.pop('results')
        return Response(data, status=status.HTTP_200_OK)