使用 Django 的 Case/When 查询集条件来设置多个值?

Posted

技术标签:

【中文标题】使用 Django 的 Case/When 查询集条件来设置多个值?【英文标题】:Using Django's Case/When queryset conditions to set more than one value? 【发布时间】:2021-10-03 23:51:58 【问题描述】:

当我的 sql 调用中的条件时,我有两个值取决于相同的情况。目前我复制了条件来分别设置每个值,但是我可以结合两个相同的情况来一次设置两个值吗?

编辑 - 添加了一个示例:

    self.filter().values(
        fee=Case(
            When(
                Q(fee_override=None) & Q(code='TYPE1'),
                then='user__fee__amount'
            ),
            When(
                Q(fee_override=None) & Q(code='TYPE2'),
                then='user__fee__amount'
            ),
            default='fee_override___amount',
            output_field=DecimalField(),
        ),
        fee_is_percent=Case(
            When(
                Q(fee_override=None) & Q(code='TYPE1'),
                then='user__fee__is_percent'
            ),
            When(
                Q(fee_override=None) & Q(code='TYPE2'),
                then='user__fee__is_percent'
            ),
            default='fee_override___is_percent',
            output_field=BooleanField(),
        )
    )

【问题讨论】:

你能分享一个例子吗? @bdbd - 添加了一个示例 【参考方案1】:

您可以将条件分组到一个带注释的字段中,然后将其用于后续注释,如下所示:

.annotate(
    is_fee_override=Case(
        When(
            Q(fee_override=None) & Q(code__in=['TYPE1', 'TYPE2'),
            then=Value(False),
        ),
        default=Value(True),
        output_field=BooleanField(),
    ),
    fee=Case(
        When(Q(is_fee_override=False), then='user__fee__amount'),
        default='fee_override___amount',
        output_field=DecimalField(),
    ),
    fee_is_percent=Case(
        When(Q(is_fee_override=False, then='user__fee__is_percent'),
        default='fee_override___is_percent',
        output_field=BooleanField(),
    )
)

我不认为同时设置两个值会起作用,因为每个 case 语句只能处理一列。

【讨论】:

以上是关于使用 Django 的 Case/When 查询集条件来设置多个值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 逻辑优化 case when 转为 union all

如何在 django 中向 Case、When 条件添加排序

select case when,用来判断查询

SQL使用CASE WHEN 行转列为啥会出现NULL值?

MySQL CASE WHEN where 子句导致失败

SQL查询语句SELECT中带有case when嵌套子查询判断的问题