Django中ItemListView聚合求和未按ID筛选,返回全部数据总和问题
解决Django ListView中聚合函数未筛选数据的问题
你当前的HBTYItem.objects.aggregate(Sum('price'))没有添加筛选条件,所以会计算整个表中所有price字段的总和,而非你通过list_id筛选后的子集总和。以下是两种解决方法:
方案1:直接在聚合查询中添加筛选条件
修改get_context_data里的聚合代码,和get_queryset一致加上filter条件:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 仅计算当前list_id对应数据的price总和 context['t_sum'] = HBTYItem.objects.filter(hbty_cust_id=self.kwargs["list_id"]).aggregate(Sum('price')) context["hbty_list"] = HBTYList.objects.get(id=self.kwargs["list_id"]) return context
方案2:复用已过滤的QuerySet(更高效)
既然get_queryset已经返回了筛选后的数据集,直接复用它做聚合,避免重复查询数据库:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 复用已过滤的数据集进行聚合 filtered_items = self.get_queryset() context['t_sum'] = filtered_items.aggregate(Sum('price')) context["hbty_list"] = HBTYList.objects.get(id=self.kwargs["list_id"]) return context
注意:get_context_data方法默认接收**kwargs参数,建议保留该参数,避免潜在的参数传递问题。
内容的提问来源于stack exchange,提问作者d3vkidhash
相关产品推荐
相关产品推荐

