From d385fefc4f4625bc741c570fc644f8ead60a5a79 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 26 May 2025 13:23:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20base=20=E7=8B=AC=E7=AB=8B=E5=87=BACompl?= =?UTF-8?q?exQueryMixin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/utils/mixins.py | 43 ++++++++++++++++++++++++++++++++++++++++++ apps/utils/viewsets.py | 43 +++++------------------------------------- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/apps/utils/mixins.py b/apps/utils/mixins.py index f639699b..f3d693f7 100755 --- a/apps/utils/mixins.py +++ b/apps/utils/mixins.py @@ -16,6 +16,8 @@ from rest_framework.generics import get_object_or_404 from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from apps.utils.serializers import PkSerializer +from rest_framework.decorators import action +from apps.utils.serializers import ComplexSerializer # 实例化myLogger myLogger = logging.getLogger('log') @@ -221,6 +223,47 @@ class CustomListModelMixin(ListModelMixin): """ return data + +class ComplexQueryMixin: + """复杂查询 + """ + + @swagger_auto_schema(request_body=ComplexSerializer, responses={200: {}}) + @action(methods=['post'], detail=False, perms_map={'post': '*'}) + def cquery(self, request): + """复杂查询 + + 复杂查询 + """ + sr = ComplexSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + queryset = self.filter_queryset(self.get_queryset()) + new_qs = queryset.none() + try: + for m in vdata.get('querys', []): + one_qs = queryset + for n in m: + st = {} + if n['compare'] == '!': # 如果是排除比较式 + st[n['field']] = n['value'] + one_qs = one_qs.exclude(**st) + elif n['compare'] == '': + st[n['field']] = n['value'] + one_qs = one_qs.filter(**st) + else: + st[n['field'] + '__' + n['compare']] = n['value'] + one_qs = one_qs.filter(**st) + new_qs = new_qs | one_qs + except Exception as e: + raise ParseError(str(e)) + page = self.paginate_queryset(new_qs) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.get_serializer(new_qs, many=True) + return Response(serializer.data) + class MyLoggingMixin(object): """Mixin to log requests""" diff --git a/apps/utils/viewsets.py b/apps/utils/viewsets.py index f13fe895..b33c973d 100755 --- a/apps/utils/viewsets.py +++ b/apps/utils/viewsets.py @@ -10,7 +10,8 @@ from rest_framework.viewsets import GenericViewSet from apps.system.models import DataFilter, Dept from apps.utils.mixins import (MyLoggingMixin, BulkCreateModelMixin, BulkUpdateModelMixin, - BulkDestroyModelMixin, CustomListModelMixin, CustomRetrieveModelMixin) + BulkDestroyModelMixin, CustomListModelMixin, + CustomRetrieveModelMixin, ComplexQueryMixin) from apps.utils.permission import ALL_PERMS, RbacPermission, get_user_perms_map from apps.utils.queryset import get_child_queryset2, get_child_queryset_u from apps.utils.serializers import ComplexSerializer @@ -187,44 +188,10 @@ class CustomGenericViewSet(MyLoggingMixin, GenericViewSet): return queryset return queryset.filter(create_by=self.request.user) + class CustomModelViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, CustomListModelMixin, - CustomRetrieveModelMixin, BulkDestroyModelMixin, CustomGenericViewSet): + CustomRetrieveModelMixin, BulkDestroyModelMixin, ComplexQueryMixin, CustomGenericViewSet): """ 增强的ModelViewSet """ - - @swagger_auto_schema(request_body=ComplexSerializer, responses={200: {}}) - @action(methods=['post'], detail=False, perms_map={'post': '*'}) - def cquery(self, request): - """复杂查询 - - 复杂查询 - """ - sr = ComplexSerializer(data=request.data) - sr.is_valid(raise_exception=True) - vdata = sr.validated_data - queryset = self.filter_queryset(self.get_queryset()) - new_qs = queryset.none() - try: - for m in vdata.get('querys', []): - one_qs = queryset - for n in m: - st = {} - if n['compare'] == '!': # 如果是排除比较式 - st[n['field']] = n['value'] - one_qs = one_qs.exclude(**st) - elif n['compare'] == '': - st[n['field']] = n['value'] - one_qs = one_qs.filter(**st) - else: - st[n['field'] + '__' + n['compare']] = n['value'] - one_qs = one_qs.filter(**st) - new_qs = new_qs | one_qs - except Exception as e: - raise ParseError(str(e)) - page = self.paginate_queryset(new_qs) - if page is not None: - serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) - serializer = self.get_serializer(new_qs, many=True) - return Response(serializer.data) + pass \ No newline at end of file