django用动态“then”值注解

new9mtju  于 2022-12-30  发布在  Go
关注(0)|答案(1)|浏览(129)

所以我有这个字典的月份如下:

MONTHS = {
    1: "Janeiro",
    2: "Fevereiro",
    3: "Março",
    4: "Abril",
    5: "Maio",
    6: "Junho",
    7: "Julho",
    8: "Agosto",
    9: "Setembro",
    10: "Outubro",
    11: "Novembro",
    12: "Dezembro",
}

我想有条件地注解查询集中的每个值,我知道我可以用Case和When来做这个,我也是这样做的:

queryset = queryset.annotate(
    last_installment_month_as_string=Case(
        When(last_installment_month=1, then=Value(MONTHS[1])),
        When(last_installment_month=2, then=Value(MONTHS[2])),
        When(last_installment_month=3, then=Value(MONTHS[3])),
        When(last_installment_month=4, then=Value(MONTHS[4])),
        When(last_installment_month=5, then=Value(MONTHS[5])),
        When(last_installment_month=6, then=Value(MONTHS[6])),
        When(last_installment_month=7, then=Value(MONTHS[7])),
        When(last_installment_month=8, then=Value(MONTHS[8])),
        When(last_installment_month=9, then=Value(MONTHS[9])),
        When(last_installment_month=10, then=Value(MONTHS[10])),
        When(last_installment_month=11, then=Value(MONTHS[11])),
        When(last_installment_month=12, then=Value(MONTHS[12])),
    )
)

但是我不能动态地做吗?比如在一个for循环中或者其他什么的?我试过在一个for循环中做,但是没有成功...
我期待做这样的事情:

for key, value in MONTHS.items():
    queryset = queryset.annotate(
    last_installment_month_as_string=Case(
        When(last_installment_month=key, then=Value(value)) 
    )
)

但那不管用!

lg40wkob

lg40wkob1#

是的,您可以使用:

queryset = queryset.annotate(
    last_installment_month_as_string=Case(
        *[
            When(last_installment_month=key, then=Value(value))
            for key, value in MONTHS.items()
        ]
    )
)

相关问题