【django admin 】汇总数据 自定义 列 数据之和
# admin.py
def changelist_view(self, request, extra_context=None):
# 调用父类的 changelist_view 方法
response = super().changelist_view(request, extra_context=extra_context)
# =============> 定义当前页面 需要汇总的列名
nameList = ['stock_cost_total', 'stock_cost']
all_columns = [field.name for field in InventoryData._meta.fields if field.name != 'id']
summary_list = []
totals = {name: 0 for name in nameList}
if hasattr(response, 'context_data'):
result_list = response.context_data['cl'].result_list
for obj in result_list:
for name in nameList:
totals[name] += getattr(obj, name, 0)
for column in all_columns:
if column in totals:
summary_list.append({column: round(float(totals[column]),2)})
else:
summary_list.append({column: 0})
if extra_context is None:
extra_context = {}
extra_context['summary_list'] = summary_list
print("extra_context", extra_context)
# =============> 定义当前页面 需要汇总的列名
返回数据:
{'summary_list': [{'wid': 0}, {'product_id': 0}, {'sku': 0}, {'seller_id': 0}, {'fnsku': 0}, {'product_total': 0}, {'product_valid_num': 0}, {'product_bad_num': 0}, {'product_qc_num': 0}, {'product_lock_num': 0}, {'stock_cost_total': 950.85}, {'quantity_receive': 0}, {'stock_cost': 18.5}, {'product_onway': 0}, {'transit_head_cost': 0}, {'average_age': 0}]}
接受数据页面:change_list.html
def changelist_view(self, request, extra_context=None):
# 调用父类的 changelist_view 方法,获取 response
response = super().changelist_view(request, extra_context=extra_context)
# =============> 定义过滤条件所有数据的 需要汇总的列名
nameList = ['stock_cost_total', 'stock_cost']
all_columns = [field.name for field in InventoryData._meta.fields if field.name != 'id']
summary_list = []
totals = {name: 0 for name in nameList}
if hasattr(response, 'context_data'):
# 获取完整的 QuerySet(包括所有搜索筛选后的数据)
full_queryset = response.context_data['cl'].queryset
# 遍历整个 QuerySet 计算总和
for obj in full_queryset:
for name in nameList:
totals[name] += getattr(obj, name, 0)
# 生成 summary_list
for column in all_columns:
if column in totals:
summary_list.append({column: round(float(totals[column]), 2)})
else:
summary_list.append({column: 0})
if extra_context is None:
extra_context = {}
# 将计算结果添加到 extra_context
extra_context['summary_list'] = summary_list
print("extra_context", extra_context)
# =============> 定义过滤条件所有数据的 需要汇总的列名
# 重新调用 changelist_view,传入更新后的 extra_context
response = super().changelist_view(request, extra_context=extra_context)
return response
Python全栈(后端、数据分析、脚本、爬虫、EXE客户端) / 前端(WEB,移动,H5) / Linux / SpringBoot / 机器学习

浙公网安备 33010602011771号