如何使用Django ORM查询计算数量乘以价格

Posted

技术标签:

【中文标题】如何使用Django ORM查询计算数量乘以价格【英文标题】:How to query to calculate the quantity times the price using Django ORM 【发布时间】:2019-08-24 10:35:06 【问题描述】:

我想知道如何在Django ORM中获得总价格:数量乘以价格,以及模板使用哪个变量来查看值?

帖子提交成功,但无法得到总价:这是我的views.py: 上下文= “门票”:Ticket.objects.all(),

"total":Ticket.objects.filter(purchaser=User.objects.get(id=request.session['user_id'])).aggregate(total_cost=Sum(F('price')*F('数量'), output_field=FloatField()) 返回渲染(请求,'first_app/confirmation.html',上下文)

这是在我的models.py中:

from django.db import models
from django.db.models import Sum, Aggregate, F

class User(models.Model):
first_name=models.CharField(max_length=100)
last_name=models.CharField(max_length=100)
email=models.CharField(max_length=100)
password=models.CharField(max_length=100)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)

class Ticket(models.Model):
venue=models.CharField(max_length=100)
quantity=models.PositiveIntegerField(default=1)
price=models.DecimalField(default=25.00, max_digits=10, decimal_places=2, 
null=True, blank=True)
loop=models.CharField(max_length=100)
purchaser = models.ForeignKey(User, related_name="purchases", 
on_delete=models.PROTECT)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)

如何查询ORM得到总数量*价格?应该在上下文中执行“ticket”键之前还是之后包含该查询?是否应该将该查询添加到工单模型字段?如模型所示,每个都硬编码为 25.00 美元。谢谢,不胜感激!

【问题讨论】:

【参考方案1】:

有两种方法可以做到这一点。

1) 您可以使用.annotate()

from django.db.models import F

tickets = Ticket.objects.all().annotate(total_price=F('total_quantity') * F('price'))

for t in tickets:
    print(t.total_price)

2) 或者,您可以在模型方法中进行计算:

...
def total_price(self):
    return self.total_quantity * self.price

print(Ticket.objects.all()[0].total_price)

=========================================

如果您遵循方法 #1,则可以通过上下文访问它:

查看

...
tickets = Ticket.objects.all().annotate(total_price=F('total_quantity') * F('price'))
return render(request, 'template.html', "tickets": tickets

模板

% for ticket in tickets %
    ticket.total_price
% endfor %

如果你遵循方法#2

查看

...
tickets = Ticket.objects.all()
return render(request, 'template.html', "tickets": tickets

模板

% for ticket in tickets %
    ticket.total_price
% endfor %

【讨论】:

context= "tickets": Ticket.objects.all().aggregate(total_price=F('quantity') * F('price'), output_field=FloatField()) -- -错误:QuerySet.aggregate() 收到非表达式:。我在models.py 中添加了FloatField, F。 'quantity' =PositiveInteger 和 'price'=DecimalField 类型,不确定是否可以在 FloatField 中输出?上面的计算模型是直接在 Ticket 模型下面还是我需要为那个添加一个字段?谢谢混合! @Keiko 错误告诉你不能使用FloatField,因为它不是一个表达式。您需要通过遍历票证中的每张票,然后调用ticket.total_price 来检查模板中的汇总价格(“total_price”) 谢谢混合。我已经完成了上述建议,并且不断收到“表达式包含混合类型。您必须设置 output_field。”因为“数量”是一个 PositiveInteger 字段,而“价格”是来自 models.py 的 DecimalField ....如果 FloatField 不起作用,我应该把什么 output_field 放在?我很感激你的帮助。 @Keiko 我的错!我没有意识到这些领域是不同的类型。试试这条线:tickets = Ticket.objects.all().annotate(total_price=Sum(F('total_quantity') * F('price'), output_field=FloatField())) 哇,明白了!我学到了很多。谢谢!终于找到箭头了呵呵。

以上是关于如何使用Django ORM查询计算数量乘以价格的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue.js 中获取购物车商品的总价格并乘以数量

Django循环进入模板,ORM

Django之ORM查询进阶

使用 Django ORM 注释查询以计算 2 个表值的总和

Django ORM 查询

Django框架——模型(models)层之ORM查询