【问题标题】:Django annotate a Boolean if field value is into an external list如果字段值在外部列表中,Django 注释布尔值
【发布时间】: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 我在查询中做错了什么,实现预期结果的正确方法是什么? 提前致谢。

【问题讨论】:

    标签: python django django-models django-queryset django-annotate


    【解决方案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())
      )
      

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 2022-12-31
        • 2015-09-19
        • 1970-01-01
        • 2019-01-22
        • 2019-12-19
        • 2020-04-11
        • 2020-09-03
        • 2012-08-26
        相关资源
        最近更新 更多