如何在多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)