如何聚合过滤后的listapiview查询集并返回一次值



如何对过滤的查询集执行聚合并仅返回一次值?

我的现有代码如下。当然,在序列化器中,PZ.objects.all()使其聚合所有项。我不知道如何从序列化器级别获得查询集。要使总价值显示一次,最好在视图中添加一个字段。但是,重写def list():会使过滤停止工作。

我需要这个,因为我正在处理一个显示具有过滤功能的文档的表。此外,还会有分页。例如,在选择了创建日期范围之后,必须对文档的值求和。

视图:

class PZListAPIView(ListAPIView):
queryset = PZ.objects.all()
serializer_class = PZModelSerializer
filterset_fields = {
'id': ['exact', 'in', 'contains', 'range']
}

序列化器:

class PZModelSerializer(serializers.ModelSerializer):
net_value_sum = serializers.SerializerMethodField('get_net_value_sum')
class Meta:
model = PZ
fields = '__all__'

def get_net_value_sum(self, obj):
return PZ.objects.aggregate(Sum('net_value'))['net_value__sum']

反应:

[
{
"id": 41,
"net_value_sum": 28.0,
"status": "C",
"net_value": "6.00"
},
{
"id": 42,
"net_value_sum": 28.0,
"status": "S",
"net_value": "10.00"
}
]

所期望的回应:

[
"net_value_sum": 16.0,
{
"id": 41,
"status": "C",
"net_value": "6.00"
},
{
"id": 42,
"status": "S",
"net_value": "10.00"
}
]

我自己设法找到了解决这个问题的方法。您需要在返回过滤后的查询集时重写'def list():'方法。然后在视图中的这个查询集上返回聚合值。代码看起来像这样:

class PZListAPIView(ListAPIView):
queryset = PZ.objects.all()
serializer_class = PZModelSerializer
filterset_fields = {
'id': ['exact', 'in', 'contains', 'range']
}

def get_queryset(self):
return PZ.objects.all()
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)

net_value = queryset.aggregate(Sum('net_value'))['net_value__sum']
return Response([{'net_value': net_value},serializer.data])

最新更新