perf: 优化所有View默认排序规则(name)

pull/12939/head
Bai 2024-04-03 17:54:46 +08:00 committed by Bryan
parent 42d7e983e4
commit 9c238a9147
12 changed files with 18 additions and 24 deletions

View File

@ -20,7 +20,6 @@ class AccountBackupPlanViewSet(OrgBulkModelViewSet):
model = AccountBackupAutomation model = AccountBackupAutomation
filterset_fields = ('name',) filterset_fields = ('name',)
search_fields = filterset_fields search_fields = filterset_fields
ordering = ('name',)
serializer_class = serializers.AccountBackupSerializer serializer_class = serializers.AccountBackupSerializer

View File

@ -93,7 +93,6 @@ class AssetViewSet(SuggestionMixin, OrgBulkModelViewSet):
model = Asset model = Asset
filterset_class = AssetFilterSet filterset_class = AssetFilterSet
search_fields = ("name", "address", "comment") search_fields = ("name", "address", "comment")
ordering = ('name',)
ordering_fields = ('name', 'address', 'connectivity', 'platform', 'date_updated', 'date_created') ordering_fields = ('name', 'address', 'connectivity', 'platform', 'date_updated', 'date_created')
serializer_classes = ( serializer_classes = (
("default", serializers.AssetSerializer), ("default", serializers.AssetSerializer),

View File

@ -19,7 +19,6 @@ class DomainViewSet(OrgBulkModelViewSet):
model = Domain model = Domain
filterset_fields = ("name",) filterset_fields = ("name",)
search_fields = filterset_fields search_fields = filterset_fields
ordering = ('name',)
serializer_classes = { serializer_classes = {
'default': serializers.DomainSerializer, 'default': serializers.DomainSerializer,
'list': serializers.DomainListSerializer, 'list': serializers.DomainListSerializer,

View File

@ -20,7 +20,7 @@ from .serializer import SerializerMixin
__all__ = [ __all__ = [
'CommonApiMixin', 'PaginatedResponseMixin', 'RelationMixin', 'CommonApiMixin', 'PaginatedResponseMixin', 'RelationMixin',
'ExtraFilterFieldsMixin', 'ExtraFilterFieldsMixin'
] ]
logger = get_logger(__name__) logger = get_logger(__name__)
@ -198,10 +198,7 @@ class OrderingFielderFieldsMixin:
model = self.queryset.model model = self.queryset.model
else: else:
queryset = self.get_queryset() queryset = self.get_queryset()
if isinstance(queryset, list): model = None if isinstance(queryset, list) else queryset.model
model = None
else:
model = queryset.model
if not model: if not model:
return [] return []
@ -226,11 +223,3 @@ class CommonApiMixin(
def is_swagger_request(self): def is_swagger_request(self):
return getattr(self, 'swagger_fake_view', False) or \ return getattr(self, 'swagger_fake_view', False) or \
getattr(self, 'raw_action', '') == 'metadata' getattr(self, 'raw_action', '') == 'metadata'
def get_queryset(self):
queryset = super().get_queryset()
if 'name' in self.ordering_fields:
self.ordering = ('name',)
return queryset

View File

@ -13,6 +13,7 @@ from rest_framework import filters
from rest_framework.compat import coreapi, coreschema from rest_framework.compat import coreapi, coreschema
from rest_framework.fields import DateTimeField from rest_framework.fields import DateTimeField
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from rest_framework.filters import OrderingFilter
from common import const from common import const
from common.db.fields import RelatedManager from common.db.fields import RelatedManager
@ -24,6 +25,7 @@ __all__ = [
'IDInFilterBackend', "CustomFilterBackend", 'IDInFilterBackend', "CustomFilterBackend",
"BaseFilterSet", 'IDNotFilterBackend', "BaseFilterSet", 'IDNotFilterBackend',
'NotOrRelFilterBackend', 'LabelFilterBackend', 'NotOrRelFilterBackend', 'LabelFilterBackend',
'RewriteOrderingFilter'
] ]
@ -335,3 +337,16 @@ class NotOrRelFilterBackend(filters.BaseFilterBackend):
queryset.query.where.connector = 'OR' queryset.query.where.connector = 'OR'
queryset._result_cache = None queryset._result_cache = None
return queryset return queryset
class RewriteOrderingFilter(OrderingFilter):
default_ordering_if_has = ('name', )
def get_default_ordering(self, view):
ordering = super().get_default_ordering(view)
# 如果 view.ordering = [] 表示不排序, 这样可以节约性能 (比如: 用户授权的资产)
if ordering is not None:
return ordering
ordering_fields = getattr(view, 'ordering_fields', self.ordering_fields)
ordering = tuple([f for f in ordering_fields if f in self.default_ordering_if_has])
return ordering

View File

@ -38,7 +38,7 @@ REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ( 'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend', 'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter', 'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter', 'common.drf.filters.RewriteOrderingFilter',
), ),
'DEFAULT_METADATA_CLASS': 'common.drf.metadata.SimpleMetadataWithFilters', 'DEFAULT_METADATA_CLASS': 'common.drf.metadata.SimpleMetadataWithFilters',
'ORDERING_PARAM': "order", 'ORDERING_PARAM': "order",

View File

@ -34,7 +34,6 @@ class OrgViewSet(JMSBulkModelViewSet):
search_fields = ('name', 'comment') search_fields = ('name', 'comment')
queryset = Organization.objects.all() queryset = Organization.objects.all()
serializer_class = OrgSerializer serializer_class = OrgSerializer
ordering = ('name',)
def get_serializer_class(self): def get_serializer_class(self):
mapper = { mapper = {

View File

@ -20,4 +20,3 @@ class AssetPermissionViewSet(OrgBulkModelViewSet):
} }
filterset_class = AssetPermissionFilter filterset_class = AssetPermissionFilter
search_fields = ('name',) search_fields = ('name',)
ordering = ('name',)

View File

@ -20,7 +20,6 @@ class AssetTreeMixin(RebuildTreeMixin, SerializeToTreeNodeMixin):
filter_queryset: callable filter_queryset: callable
get_queryset: callable get_queryset: callable
ordering = ('name',)
filterset_fields = ('id', 'name', 'address', 'comment') filterset_fields = ('id', 'name', 'address', 'comment')
search_fields = ('name', 'address', 'comment') search_fields = ('name', 'address', 'comment')

View File

@ -37,7 +37,6 @@ class BaseStorageViewSetMixin:
class CommandStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet): class CommandStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
search_fields = ('name', 'type') search_fields = ('name', 'type')
ordering = ('name',)
queryset = CommandStorage.objects.all() queryset = CommandStorage.objects.all()
serializer_class = CommandStorageSerializer serializer_class = CommandStorageSerializer
filterset_class = CommandStorageFilter filterset_class = CommandStorageFilter
@ -115,7 +114,6 @@ class ReplayStorageFilterSet(BaseFilterSet):
class ReplayStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet): class ReplayStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
search_fields = ('name', 'type', 'is_default') search_fields = ('name', 'type', 'is_default')
ordering = ('name',)
queryset = ReplayStorage.objects.all() queryset = ReplayStorage.objects.all()
serializer_class = ReplayStorageSerializer serializer_class = ReplayStorageSerializer
filterset_class = ReplayStorageFilterSet filterset_class = ReplayStorageFilterSet

View File

@ -19,7 +19,6 @@ class UserGroupViewSet(OrgBulkModelViewSet):
'default': UserGroupSerializer, 'default': UserGroupSerializer,
'list': UserGroupListSerializer, 'list': UserGroupListSerializer,
} }
ordering = ('name',)
rbac_perms = ( rbac_perms = (
("add_all_users", "users.add_usergroup"), ("add_all_users", "users.add_usergroup"),
) )

View File

@ -44,7 +44,6 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV
'suggestion': MiniUserSerializer, 'suggestion': MiniUserSerializer,
'invite': InviteSerializer, 'invite': InviteSerializer,
} }
ordering = ('name',)
rbac_perms = { rbac_perms = {
'match': 'users.match_user', 'match': 'users.match_user',
'invite': 'users.invite_user', 'invite': 'users.invite_user',