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
filterset_fields = ('name',)
search_fields = filterset_fields
ordering = ('name',)
serializer_class = serializers.AccountBackupSerializer

View File

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

View File

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

View File

@ -20,7 +20,7 @@ from .serializer import SerializerMixin
__all__ = [
'CommonApiMixin', 'PaginatedResponseMixin', 'RelationMixin',
'ExtraFilterFieldsMixin',
'ExtraFilterFieldsMixin'
]
logger = get_logger(__name__)
@ -198,10 +198,7 @@ class OrderingFielderFieldsMixin:
model = self.queryset.model
else:
queryset = self.get_queryset()
if isinstance(queryset, list):
model = None
else:
model = queryset.model
model = None if isinstance(queryset, list) else queryset.model
if not model:
return []
@ -226,11 +223,3 @@ class CommonApiMixin(
def is_swagger_request(self):
return getattr(self, 'swagger_fake_view', False) or \
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.fields import DateTimeField
from rest_framework.serializers import ValidationError
from rest_framework.filters import OrderingFilter
from common import const
from common.db.fields import RelatedManager
@ -24,6 +25,7 @@ __all__ = [
'IDInFilterBackend', "CustomFilterBackend",
"BaseFilterSet", 'IDNotFilterBackend',
'NotOrRelFilterBackend', 'LabelFilterBackend',
'RewriteOrderingFilter'
]
@ -335,3 +337,16 @@ class NotOrRelFilterBackend(filters.BaseFilterBackend):
queryset.query.where.connector = 'OR'
queryset._result_cache = None
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': (
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
'common.drf.filters.RewriteOrderingFilter',
),
'DEFAULT_METADATA_CLASS': 'common.drf.metadata.SimpleMetadataWithFilters',
'ORDERING_PARAM': "order",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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