diff --git a/apps/utils/mixins.py b/apps/utils/mixins.py index f3d693f7..4d83f9af 100755 --- a/apps/utils/mixins.py +++ b/apps/utils/mixins.py @@ -238,25 +238,34 @@ class ComplexQueryMixin: 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)) + queryset = self.get_queryset() + querys = vdata.get('query', []) + if not querys: + new_qs = queryset + else: + new_qs = queryset.none() + try: + for m in 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)) + ordering = vdata.get('ordering', None) + if not ordering: + ordering = getattr(self, 'ordering', None) + if ordering: + new_qs = new_qs.order_by(*ordering.split(',')) page = self.paginate_queryset(new_qs) if page is not None: serializer = self.get_serializer(page, many=True) diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index 77db28cd..7ab62326 100755 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -82,5 +82,6 @@ class QuerySerializer(serializers.Serializer): class ComplexSerializer(serializers.Serializer): page = serializers.IntegerField(min_value=0, required=False) page_size = serializers.IntegerField(min_value=1, required=False) + ordering = serializers.CharField(required=False) querys = serializers.ListField(child=QuerySerializer( many=True), label="查询列表", required=False)