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
相关产品推荐
相关产品推荐

