2

I have two values that depend on the same case when condition in my sql call. Currently I duplicate the condition to set each value separately, but can I combine the two identical cases to set both values at once?

edit - added an example:

    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(),
        )
    )
Brian Destura
  • 11,487
  • 3
  • 18
  • 34
be2213444
  • 607
  • 1
  • 4
  • 10

1 Answers1

1

You can group the conditions into one annotated field, then use it on succeeding annotations like this:

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

I don't think setting both values at once will work, since we can only work on one column per case statement.

Brian Destura
  • 11,487
  • 3
  • 18
  • 34