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

Posted

技术标签:

【中文标题】如果字段值在外部列表中,Django 注释布尔值【英文标题】:Django annotate a Boolean if field value is into an external list 【发布时间】:2021-03-08 12:03:34 【问题描述】:

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

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

还有这个列表:

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

我想查询 Letter 注释一个布尔字段,如果 name 值在 vowels 列表中,则为 True,否则为 False 我做了下一个查询:

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

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

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

【问题讨论】:

【参考方案1】:

您可以使用以下查询。 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()
               ),
            )

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如果字段值在外部列表中,Django 注释布尔值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django ORM 将注释字符串转换为布尔值

Django 管理员。当对象具有布尔字段== True时,如何为列表视图中的每一行添加背景颜色?

如何使 STATIC_URL 在外部 JS 文件(Django)中工作

如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段

用日期时间注释 Django 查询集

仅具有查看权限的 Django 模型表单将所有字段排除在外