【问题标题】:Using Django's Case/When queryset conditions to set more than one value?使用 Django 的 Case/When 查询集条件来设置多个值?
【发布时间】: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 - 添加了一个示例

标签: django postgresql django-queryset django-q django-postgresql


【解决方案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 语句只能处理一列。

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2020-08-08
    • 2021-07-12
    • 2018-06-11
    • 2021-11-04
    • 2017-04-20
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多