perf: 修改 export 使用的 serializer

pull/12934/head
ibuler 2024-04-02 15:55:08 +08:00 committed by Bryan
parent 2f16bdc4be
commit 3b8aab8c25
2 changed files with 14 additions and 0 deletions

View File

@ -6,6 +6,7 @@ from typing import Callable
from django.db import models
from django.db.models.signals import m2m_changed
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.settings import api_settings
@ -89,6 +90,7 @@ class RelationMixin:
class QuerySetMixin:
action: str
request: Request
get_serializer_class: Callable
get_queryset: Callable
@ -98,8 +100,18 @@ class QuerySetMixin:
return queryset
if self.action == 'metadata':
queryset = queryset.none()
queryset = self.setup_eager_loading(queryset)
return queryset
# Todo: 未来考虑自定义 pagination
def setup_eager_loading(self, queryset):
if self.request.query_params.get('format') not in ['csv', 'xlsx']:
return queryset
serializer_class = self.get_serializer_class()
if not serializer_class or not hasattr(serializer_class, 'setup_eager_loading'):
return queryset
return serializer_class.setup_eager_loading(queryset)
def paginate_queryset(self, queryset):
page = super().paginate_queryset(queryset)
serializer_class = self.get_serializer_class()

View File

@ -27,6 +27,8 @@ class SerializerMixin:
return None
serializer_classes = dict(serializer_classes)
view_action = self.request.query_params.get('action') or self.action or 'list'
if self.request.query_params.get('format'):
view_action = 'retrieve'
serializer_class = serializer_classes.get(view_action)
if serializer_class is None: