如何对筛选的查询集执行聚合并只返回一次值?
下面是我现有的代码。在序列化器中,当然PZ.objects.all()使它聚合所有项。我不知道如何从序列化器级别获得queryset。要使合计值只出现一次,在视图中添加一个字段是个好主意。然而,重写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"
}
]
1条答案
按热度按时间i7uq4tfw1#
我自己设法找到了这个问题的解决方案。在返回过滤后的queryset时,需要覆盖'def list():'方法。然后在视图中的这个queryset上返回聚合值。代码如下所示: