feat: base ComplexQueryMixin 支持order查询

This commit is contained in:
caoqianming 2025-05-26 16:31:17 +08:00
parent 42ba894875
commit f4fd214110
2 changed files with 29 additions and 19 deletions

View File

@ -238,25 +238,34 @@ class ComplexQueryMixin:
sr = ComplexSerializer(data=request.data) sr = ComplexSerializer(data=request.data)
sr.is_valid(raise_exception=True) sr.is_valid(raise_exception=True)
vdata = sr.validated_data vdata = sr.validated_data
queryset = self.filter_queryset(self.get_queryset()) queryset = self.get_queryset()
new_qs = queryset.none() querys = vdata.get('query', [])
try: if not querys:
for m in vdata.get('querys', []): new_qs = queryset
one_qs = queryset else:
for n in m: new_qs = queryset.none()
st = {} try:
if n['compare'] == '!': # 如果是排除比较式 for m in querys:
st[n['field']] = n['value'] one_qs = queryset
one_qs = one_qs.exclude(**st) for n in m:
elif n['compare'] == '': st = {}
st[n['field']] = n['value'] if n['compare'] == '!': # 如果是排除比较式
one_qs = one_qs.filter(**st) st[n['field']] = n['value']
else: one_qs = one_qs.exclude(**st)
st[n['field'] + '__' + n['compare']] = n['value'] elif n['compare'] == '':
one_qs = one_qs.filter(**st) st[n['field']] = n['value']
new_qs = new_qs | one_qs one_qs = one_qs.filter(**st)
except Exception as e: else:
raise ParseError(str(e)) 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) page = self.paginate_queryset(new_qs)
if page is not None: if page is not None:
serializer = self.get_serializer(page, many=True) serializer = self.get_serializer(page, many=True)

View File

@ -82,5 +82,6 @@ class QuerySerializer(serializers.Serializer):
class ComplexSerializer(serializers.Serializer): class ComplexSerializer(serializers.Serializer):
page = serializers.IntegerField(min_value=0, required=False) page = serializers.IntegerField(min_value=0, required=False)
page_size = serializers.IntegerField(min_value=1, required=False) page_size = serializers.IntegerField(min_value=1, required=False)
ordering = serializers.CharField(required=False)
querys = serializers.ListField(child=QuerySerializer( querys = serializers.ListField(child=QuerySerializer(
many=True), label="查询列表", required=False) many=True), label="查询列表", required=False)