You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何对当前登录用户同模型行内多字段求和?

解决方案

先纠正你代码里的几个关键问题:

  • 字段名拼写错误:模型定义的是tax1/tax2/tax3,但视图里写的是tax_1/tax_2/tax_3,这会导致字段查找失败的错误。
  • 重复查询数据库:多次执行User.objects.filter(username=request.user)完全没必要,登录后request.user本身就是当前的用户对象,直接使用即可。
  • 误用aggregate:aggregate是用来对查询集的整列数据求和(比如所有用户的tax1总和),而你要的是单个用户的三个字段求和,不需要用这个方法。

方法一:直接在视图中计算总和

修改views.py如下:

def Calc(request):
    # 当前登录用户对象
    current_user = request.user
    # 提取单个用户的三个税费字段
    m_tax1 = current_user.tax1
    m_tax2 = current_user.tax2
    m_tax3 = current_user.tax3
    # 计算总和
    total_tax = m_tax1 + m_tax2 + m_tax3

    context = {
        'm_tax1': m_tax1,
        'm_tax2': m_tax2,
        'm_tax3': m_tax3,
        'total_tax': total_tax
    }

    return render(request, 'main/calc.html', context)

对应的模板可以优化为更清晰的显示:

{{ m_tax1 }}
+
{{ m_tax2 }}
+
{{ m_tax3 }}
=
{{ total_tax }}

方法二:在模型中添加属性(推荐)

为了代码复用和符合Django的设计原则,在User模型中添加一个属性方法,直接返回该用户的税费总和:

修改models.py:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    username = models.CharField(unique=True, max_length=20, null=True)
    email = models.EmailField(null=True)
    tax1 = models.DecimalField(max_digits=7, decimal_places=2, default=0)
    tax2 = models.DecimalField(max_digits=7, decimal_places=2, default=0)
    tax3 = models.DecimalField(max_digits=7, decimal_places=2, default=0)

    @property
    def total_tax(self):
        # 计算当前用户的三个税费总和
        return self.tax1 + self.tax2 + self.tax3

然后视图可以简化为:

def Calc(request):
    current_user = request.user
    context = {
        'm_tax1': current_user.tax1,
        'm_tax2': current_user.tax2,
        'm_tax3': current_user.tax3,
        'total_tax': current_user.total_tax
    }
    return render(request, 'main/calc.html', context)

这样后续在任何需要获取用户税费总和的地方,直接调用user.total_tax即可,无需重复编写求和逻辑。

内容的提问来源于stack exchange,提问作者gwka01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:17:21