【问题标题】:Calculate the sum by group using Queryset API使用 Queryset API 按组计算总和
【发布时间】:2018-08-12 07:36:28
【问题描述】:

我有这样一张表:

MySQL [distributor]> select * from orderitems;
+-----------+------------+---------+----------+------------+
| order_num | order_item | prod_id | quantity | item_price |
+-----------+------------+---------+----------+------------+
|     20005 |          1 | BR01    |      100 |       5.49 |
|     20005 |          2 | BR03    |      100 |      10.99 |
|     20006 |          1 | BR01    |       20 |       5.99 |
|     20006 |          2 | BR02    |       10 |       8.99 |
|     20006 |          3 | BR03    |       10 |      11.99 |
|     20007 |          1 | BR03    |       50 |      11.49 |
|     20007 |          2 | BNBG01  |      100 |       2.99 |
|     20007 |          3 | BNBG02  |      100 |       2.99 |
|     20007 |          4 | BNBG03  |      100 |       2.99 |
|     20007 |          5 | RGAN01  |       50 |       4.49 |
|     20008 |          1 | RGAN01  |        5 |       4.99 |
|     20008 |          2 | BR03    |        5 |      11.99 |
|     20008 |          3 | BNBG01  |       10 |       3.49 |
|     20008 |          4 | BNBG02  |       10 |       3.49 |
|     20008 |          5 | BNBG03  |       10 |       3.49 |
|     20009 |          1 | BNBG01  |      250 |       2.49 |
|     20009 |          2 | BNBG02  |      250 |       2.49 |
|     20009 |          3 | BNBG03  |      250 |       2.49 |
+-----------+------------+---------+----------+------------+
18 rows in set (0.070 sec)

每个订单的total_price可以用原始SQL计算为;

MySQL [distributor]> select order_num, sum(quantity*item_price) as total_price
    -> from orderitems
    -> group by order_num
    -> order by total_price;
+-----------+-------------+
| order_num | total_price |
+-----------+-------------+
|     20008 |      189.60 |
|     20006 |      329.60 |
|     20005 |     1648.00 |
|     20007 |     1696.00 |
|     20009 |     1867.50 |
+-----------+-------------+
5 rows in set (0.041 sec)

我想使用 Django ORM 来完成它,
检查 Queryset API 文档后,我找到了sum,但没有找到“组”。

如何使用 Django Queryset 完成任务?

【问题讨论】:

  • 请分享您的OrderItems 模型。

标签: django


【解决方案1】:

您可以使用.values(..).order_by(..) 的组合执行GROUP BY

from django.db.models import F, Sum

OrderItems.objects.values('order_number').annotate(
    total_price=Sum(F('quantity') * F('item_price'))
).order_by('order_number')

这将返回一个 QuerySet,其中包含每个都有两个键的字典:'order_item' 和 'total_price'`。比如:

<QuerySet [{'order_item': 20005, 'total_price': 1648.00},
           {'order_item': 20006, 'total_price': 329.60},
           {'order_item': 20007, 'total_price': 1696.00},
           {'order_item': 20008, 'total_price': 189.60},
           {'order_item': 20009, 'total_price': 1867.50}]>

注意:通常 Django 中的模型名称是单数,所以OrderItem,而不是OrderItems

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2012-11-19
    • 2021-12-16
    相关资源
    最近更新 更多