feat: base cquery支持annotate
This commit is contained in:
parent
dbaf121685
commit
5d3c4137fe
|
@ -243,6 +243,8 @@ class ComplexQueryMixin:
|
||||||
vdata = sr.validated_data
|
vdata = sr.validated_data
|
||||||
queryset = self.get_queryset()
|
queryset = self.get_queryset()
|
||||||
querys = vdata.get('querys', [])
|
querys = vdata.get('querys', [])
|
||||||
|
annotate_field_list = vdata.get('annotate_field_list', [])
|
||||||
|
|
||||||
if not querys:
|
if not querys:
|
||||||
new_qs = queryset
|
new_qs = queryset
|
||||||
else:
|
else:
|
||||||
|
@ -264,17 +266,29 @@ class ComplexQueryMixin:
|
||||||
new_qs = new_qs | one_qs
|
new_qs = new_qs | one_qs
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ParseError(str(e))
|
raise ParseError(str(e))
|
||||||
|
|
||||||
|
if annotate_field_list:
|
||||||
|
annotate_dict = getattr(self, "annotate_dict", {})
|
||||||
|
if annotate_dict:
|
||||||
|
filtered_annotate_dict = { key: annotate_dict[key] for key in annotate_field_list if key in annotate_dict}
|
||||||
|
new_qs = new_qs.annotate(**filtered_annotate_dict)
|
||||||
|
|
||||||
ordering = vdata.get('ordering', None)
|
ordering = vdata.get('ordering', None)
|
||||||
if not ordering:
|
if not ordering:
|
||||||
ordering = getattr(self, 'ordering', None)
|
ordering = getattr(self, 'ordering', None)
|
||||||
if isinstance(ordering, str):
|
if isinstance(ordering, str):
|
||||||
|
ordering = ordering.replace('\n', '').replace(' ', '')
|
||||||
ordering = ordering.split(',')
|
ordering = ordering.split(',')
|
||||||
|
order_fields = []
|
||||||
if ordering:
|
if ordering:
|
||||||
for item in ordering:
|
for item in ordering:
|
||||||
if item.startswith('-'):
|
if item.startswith('-'):
|
||||||
new_qs = new_qs.order_by(F(item[1:]).desc(nulls_last=True))
|
# JSONField 排序只能用字符串,不要 F
|
||||||
|
order_fields.append(F(item[1:]).desc(nulls_last=True) if '__' not in item else item)
|
||||||
else:
|
else:
|
||||||
new_qs = new_qs.order_by(item)
|
order_fields.append(F(item).asc(nulls_last=True) if '__' not in item else item)
|
||||||
|
new_qs = new_qs.order_by(*order_fields)
|
||||||
|
|
||||||
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)
|
||||||
|
|
|
@ -85,3 +85,4 @@ class ComplexSerializer(serializers.Serializer):
|
||||||
ordering = serializers.CharField(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)
|
||||||
|
annotate_field_list = serializers.ListField(child=serializers.CharField(), label="RawSQL字段列表", required=False)
|
||||||
|
|
Loading…
Reference in New Issue