使用 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