首页 > 解决方案 > 在 django 中将三个模型相乘并在视图中得到结果

问题描述

我的模型:

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)


def __str__(self):
    return self.title

我想分配:

total_value = (shares_number * (course - fare)) and just print it in terminal

我的看法:

def summaryPage(request):
visdata = VisData.objects.all()
#print(visdata)

context = {}
return render(request, 'smth/homepage.html', context)

我找到了一些接近的答案,但我无法理解解决方案,也无法在我的代码中使用它们。

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


您可能需要的称为聚合

from django.db.models import F, Sum


def summaryPage(request):
    aggregated_data = VisData.objects.annotate(
       intermid_result=F('course') - F('fare')
    ).annotate(
       record_total=F('shares_number') * F('intermid_result')
    ).aggregate(
       total=SUM('record_total')
    )
    result = aggregated_data['total']
    print(result)
    ...

此查询将使用值注释每条记录,record_total = shares_number * (course - fare)然后计算record_total所有记录的总和。

还要尽量避免在 Python 中使用驼峰式函数名。有关详细信息,请参见此处


推荐阅读