Django中对VisData模型字段运算得到total_value并在视图中打印的实现方法
实现方案
方案1:模型层增加计算属性(推荐,逻辑可复用)
直接在你的VisData模型中新增只读计算属性,不需要修改数据库结构:
class VisData(models.Model): visdata_id = models.AutoField(primary_key=True,blank=True) user_name = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL,blank=True) title = models.CharField(max_length=200, null=True,blank=True) buy_sell = models.CharField(max_length=1, null=True,blank=True) date = models.DateField(auto_now_add=False,null=True,editable=True,blank=True) hour = models.TimeField(auto_now=False, auto_now_add=False,null=True,editable=True,blank=True) shares_number = models.DecimalField(decimal_places=0,default=0,max_digits=999,null=True,blank=True) course = models.DecimalField(decimal_places=2,default=0,max_digits=999,null=True,blank=True) fare = models.DecimalField(decimal_places=2,default=0,max_digits=999,null=True,blank=True) # 新增的计算属性 @property def total_value(self): # 空值校验,避免字段为None时报错 if not all([self.shares_number, self.course, self.fare]): return 0 return self.shares_number * (self.course - self.fare) def __str__(self): return self.title
修改视图代码遍历打印结果:
def summaryPage(request): visdata = VisData.objects.all() # 遍历所有数据打印total_value for item in visdata: print(f"数据ID:{item.visdata_id} 标题:{item.title} 总价值:{item.total_value}") # 如果前端也需要展示total_value,直接把列表传入context即可 context = { 'visdata_list': visdata } return render(request, 'smth/homepage.html', context)
方案2:ORM查询时直接计算(适合临时批量计算场景)
不需要修改模型,直接通过Django的F表达式在查询阶段完成计算:
from django.db.models import F, ExpressionWrapper, DecimalField def summaryPage(request): # 查询时直接注解生成total_value字段 visdata = VisData.objects.annotate( total_value=ExpressionWrapper( F('shares_number') * (F('course') - F('fare')), output_field=DecimalField(max_digits=999, decimal_places=2) ) ) # 打印结果 for item in visdata: print(f"数据ID:{item.visdata_id} 标题:{item.title} 总价值:{item.total_value}") context = {} return render(request, 'smth/homepage.html', context)
额外说明
如果后续需要把计算结果持久化存储到数据库,可以给模型新增total_value字段,重写模型的save()方法,每次保存数据时自动计算赋值即可。
内容的提问来源于stack exchange,提问作者Maksym Kokocinski
相关产品推荐
相关产品推荐

