diff --git a/apps/common/api/mixin.py b/apps/common/api/mixin.py index 7db2056ac..40ea6ee27 100644 --- a/apps/common/api/mixin.py +++ b/apps/common/api/mixin.py @@ -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() diff --git a/apps/common/api/serializer.py b/apps/common/api/serializer.py index 84cad19ff..539ff2868 100644 --- a/apps/common/api/serializer.py +++ b/apps/common/api/serializer.py @@ -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: