【问题标题】:Product of two fields annotation两个字段注释的乘积
【发布时间】:2011-05-11 09:50:49
【问题描述】:

我目前在我的 Django 应用中有这样一行:

db.execute("SELECT SUM(price * qty) FROM inventory_orderline WHERE order_id = %s", [self.id])

我宁愿通过我的 Django 提供的模型界面执行此操作,但找不到任何参考。

我很确定这可以通过注释来完成,但示例仅涵盖其中的几个,我在文档中找不到列表。

我想做这样的事情:

self.line_items.annotate(lineprice=Product('orderline__price', 'orderline__qty')).aggregate(Sum('lineprice'))

谁能推荐一个注释类来执行乘法?更好的是,一个指向列出所有这些注释/聚合类的 API 的链接?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    没有明确记录,但这可以通过F() 函数完成:

    from django.db.models import F
    
    self.line_items.annotate(lineprice=F('orderline__price') * F('orderline__qty')).aggregate(Sum('lineprice'))
    

    【讨论】:

      【解决方案2】:

      不幸的是,aren't enough 内置了聚合函数,具体来说,没有一个用于产品。

      但这不会以任何方式限制您,除非您必须编写“不简洁”的 ORM 查询。特别针对您的情况,您应该能够:

      self.line_items.extra(select=("lineprice": "orderline__price*orderline__qty")).aggregate(Sum('lineprice'))
      

      【讨论】:

      • 谢谢,我第一次看到这种技术。
      • 我可以完成这项工作,但我必须使用 SUM(price*qty) 因为它不遵循双“_”关系,并且聚合看不到“lineprice”字段。恐怕还是不太理想
      • 这行不通。 aggregate 看不到 extra 介绍的内容(select 也需要字典,因此需要 {} 而不是 ()
      • 这不起作用。你为什么要发布一个不起作用的解决方案。
      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2014-09-11
      • 2020-06-03
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多