首页 > 解决方案 > 如何在 Django 中使用 UNION + 添加假列

问题描述

我正在尝试在 django ORM 中转换以下查询:

SELECT 
    MONTH(date) AS Month,
    col1,
    col2,
    col3 col3,
    SUM(col4) col4,
    SUM(col5) col5
FROM
    table1
WHERE
    date BETWEEN '2018-07-19' AND '2018-10-17'
GROUP BY 1 , 2 , 3 , 4 

UNION ALL 

SELECT 
    MONTH(date) AS Month,
    col1,
    col2,
    0 col3,
    SUM(col4) col4,
    0 col5
FROM
    table2
WHERE
    date BETWEEN '2018-07-19' AND '2018-10-17'
GROUP BY 1 , 2 , 3 , 4

在 MySQL Workbench 中运行良好。但在 django 我看到错误 - 我不能这样做:

result2 = table2.objects.\
        filter( date__range=( self.data['start_date'], self.data['end_date'] ) ).\
            annotate(month=TruncMonth('date')).\
        values("month", "col1", "col2", "0").\
            annotate( col4=Sum('col4'), col5=Sum(0))

因为“无法将关键字 '0' 解析为字段。”

您对此有什么想法吗?想创建 2 个相同的对象,然后使用union()合并表

我正在使用 django 1.11

标签: djangodjango-models

解决方案


如果要向查询集添加具有固定值的列,可以使用值表达式

from django.db.models import Value, IntegerField

result2 = table2.objects.annotate(col5=Value(0, output_field=IntegerField())

推荐阅读