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



在sql调用中,我有两个值依赖于相同的case when条件。目前,我复制了条件来分别设置每个值,但是我可以结合两个相同的情况来同时设置两个值吗?

edit -添加示例:

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(),
)
)

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

.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语句只能处理一列。

最新更新