【问题标题】:How to get the total of sales for each product, aggregation of foreignkey如何获得每个产品的总销售额,外键聚合
【发布时间】:2021-03-28 01:26:22
【问题描述】:

我正在开发一个小型 django 项目。在我的 models.py 中,我有一个 Product 类,例如:

class Product(models.Model):
     ...

我有一个Sales 类,例如:

class Sales(models.Model):
     item = models.ForeignKey(Product)
     quantity = models.IntegerField()

我想显示我所有产品的列表以及每个产品的总销售额...

我希望我的问题很清楚。

谢谢

【问题讨论】:

标签: sql django database django-views django-templates


【解决方案1】:

您可以使用values按产品分组,然后聚合得到总价。

#assumption
class Product(models.Model):
     price = models.DecimalField(...)
     ...

Sales.objects.values('item').annotate(total=Sum(F('quantity') * F('item__price')))

# provide more infomation if you want to loop in template
Sales.objects.values('item').annotate(
   price_sum = Sum(F('quantity') *  F('item__price')), 
   quantity_sum = Sum('quantity'),
   product_name = F('item__name')
)

模板

{% for sale in sales %}
    {{ sale.product_name }}
    {{ sale.quantity_sum }}
    {{ sale.price_sum }}
{% endfor %}

【讨论】:

  • 非常感谢您的回复,我按照您的建议做了:sales = Sales.objects....并且我将上下文变量中的销售额传递给了我的模板。然后在我的模板中,我做了类似 {% for sale in sales %} {{ sale.item}} : {{ sale.quantity }} {% endfor %} 但我认为我错了,因为我得到了一个我不太理解的奇怪输出......
  • @MounirBenhalima group by 操作后,查询集被压缩,只包含每个项目的聚合结果。它看起来像 dict [{"id":1, "total": 256.6}, {"id":2, ...}] 的列表,你必须像在普通的 dict 上循环一样循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多