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

Eri*_*nes 3 python django django-models django-queryset django-annotate

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

class Letter(models.Model):
    name = models.CharField(max_length=1, unique=True)
Run Code Online (Sandbox Code Playgroud)

还有这个列表:

vowels = ['a', 'e', 'i', 'o', 'u']
Run Code Online (Sandbox Code Playgroud)

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())
)
Run Code Online (Sandbox Code Playgroud)

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

小智 6

您可以使用以下查询。django doc 条件表达式

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()
               ),
            )
Run Code Online (Sandbox Code Playgroud)


小智 6

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

letters = Letter.objects.annotate(
    is_vowel=ExpressionWrapper(Q(name__in=vowels), output_field=BooleanField())
)
Run Code Online (Sandbox Code Playgroud)