如何使用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() 收到非表达式: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查询计算数量乘以价格的主要内容,如果未能解决你的问题,请参考以下文章