【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
posted @ 2025-03-18 17:12  PythonNew_Mr.Wang  Views(52)  Comments(0)    收藏  举报