如果字段值在外部列表中,Django 注释布尔值

想象一下我有这个 Django 模型:

class Letter(models.Model):
    name = models.CharField(max_length=1, unique=True)

还有这个列表:

vowels = ['a', 'e', 'i', 'o', 'u']

我想对注释布尔字段的 Letter 进行查询,如果 True 值在 name 列表中,它将是 vowels ,否则为 False

我做了下一个查询:

from django.db.models import Value, F, BooleanField

letters = Letter.objects.annotate(
    is_vowel=Value(F('name') in vowels, output_field=BooleanField())
)

但是,无论我分析什么字母,结果总是 False 我在查询中做错了什么,实现预期结果的正确方法是什么?提前致谢。

stack overflow Django annotate a Boolean if field value is in an external list
原文答案

答案:

作者头像

您可以使用以下查询。 django doc conditional expressions

from django.db.models import Value, BooleanField, Case, When

letters = Letter.objects.annotate(
              is_vowel=Case(
                  When(name__in=vowels, then=Value(True)),
                  default=Value(False),
                  output_field=BooleanField()
               ),
            )
作者头像

Django 查询表达式不支持 in 运算符,但您可以使用 ExpressionWrapper

letters = Letter.objects.annotate(
    is_vowel=ExpressionWrapper(Q(name__in=vowels), output_field=BooleanField())
)