mirror of https://github.com/jumpserver/jumpserver
perf: 修改 export 使用的 serializer
parent
2f16bdc4be
commit
3b8aab8c25
|
@ -6,6 +6,7 @@ from typing import Callable
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.signals import m2m_changed
|
from django.db.models.signals import m2m_changed
|
||||||
|
from rest_framework.request import Request
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
|
||||||
|
@ -89,6 +90,7 @@ class RelationMixin:
|
||||||
|
|
||||||
class QuerySetMixin:
|
class QuerySetMixin:
|
||||||
action: str
|
action: str
|
||||||
|
request: Request
|
||||||
get_serializer_class: Callable
|
get_serializer_class: Callable
|
||||||
get_queryset: Callable
|
get_queryset: Callable
|
||||||
|
|
||||||
|
@ -98,8 +100,18 @@ class QuerySetMixin:
|
||||||
return queryset
|
return queryset
|
||||||
if self.action == 'metadata':
|
if self.action == 'metadata':
|
||||||
queryset = queryset.none()
|
queryset = queryset.none()
|
||||||
|
queryset = self.setup_eager_loading(queryset)
|
||||||
return 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):
|
def paginate_queryset(self, queryset):
|
||||||
page = super().paginate_queryset(queryset)
|
page = super().paginate_queryset(queryset)
|
||||||
serializer_class = self.get_serializer_class()
|
serializer_class = self.get_serializer_class()
|
||||||
|
|
|
@ -27,6 +27,8 @@ class SerializerMixin:
|
||||||
return None
|
return None
|
||||||
serializer_classes = dict(serializer_classes)
|
serializer_classes = dict(serializer_classes)
|
||||||
view_action = self.request.query_params.get('action') or self.action or 'list'
|
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)
|
serializer_class = serializer_classes.get(view_action)
|
||||||
|
|
||||||
if serializer_class is None:
|
if serializer_class is None:
|
||||||
|
|
Loading…
Reference in New Issue