【问题标题】:Django ORM IF statementDjango ORM IF 语句
【发布时间】:2016-10-31 07:11:02
【问题描述】:

我有这张桌子

通过 SQL 查询,我可以获得关于每辆车的总“金额”、“已检查”|“未检查”行的数量以及完成检查一辆车所有行的标志的汇总信息:

SELECT 
car_id 
, SUM(amount) as total_amount
, Sum(IF(checked=1,1,0)) as already_checked
, Sum(IF(checked=0,1,0)) as not_cjecked
, IF(Sum(IF(checked=0,1,0))=0,1,0) as check_finished
FROM 
    refuels_flow
GROUP BY car_id

结果:

+--------+--------------+-----------------+-------------+----------------+
| car_id | total_amount | already_checked | not_cjecked | check_finished |
+--------+--------------+-----------------+-------------+----------------+
|      1 | 1300         | 1               | 12          |              0 |
|      2 | 300          | 3               | 0           |              1 |
+--------+--------------+-----------------+-------------+----------------+

问题是 - 我如何使用 Django ORM(不使用原始查询)做到这一点?

【问题讨论】:

  • 你使用的是什么数据库后端?

标签: django orm aggregate


【解决方案1】:

要获得相同的 SQL 输出,您可以使用以下查询集:

already_checked = Sum(Func('checked', function='IF', template='%(function)s(%(expressions)s=0, 0, 1)'))
not_checked = Sum(Func('checked', function='IF', template='%(function)s(%(expressions)s=0, 1, 0)'))
check_finished = Func(
        not_checked,
        function='IF', template='%(function)s(%(expressions)s=0, 1, 0)'
)
Refuels.objects.values('car_id').annotate(
    total_amount=Sum('amount'),
    already_checked=already_checked,
    not_checked=not_checked,
    check_finished=check_finished
)

查看表达式上的doc 了解更多信息。

现在,already_checked 可以简化为:

already_checked = Sum('checked')

您可以在 Python 中注释计数并轻松计算它们,而不是使用 not_checked 和 check_finished 注释,例如:

qs = Refuels.objects.values('car_id').annotate(
    count_for_car=Count('car_id'),
    total_amount=Sum('amount'),
    already_checked=Sum('checked'),
)

for entry in qs:
    not_checked = entry['count_for_car'] - entry['already_checked']
    check_finished = not_checked == 0

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2023-03-16
    • 2018-08-05
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2013-10-17
    相关资源
    最近更新 更多