【问题标题】:How to query to calculate the quantity times the price using Django ORM如何使用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 美元。谢谢,不胜感激!

【问题讨论】:

    标签: django model aggregate django-queryset


    【解决方案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()))
    • 哇,明白了!我学到了很多。谢谢!终于找到箭头了呵呵。
    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多