如何修复 Django annotate() 引发的 AttributeError: 'WhereNode' 对象没有属性 'select_format'?

djv*_*jvg 7 python django django-queryset

关于 SO 有很多类似的问题,但是这个特定的错误消息没有出现在我的任何搜索中:

AttributeError: 'WhereNode' object has no attribute 'select_format'
Run Code Online (Sandbox Code Playgroud)

当尝试使用annotate()比较(布尔)结果的 Django 查询集时会引发此问题,例如以下简化示例中的gt 查找:

Score.objects.annotate(positive=Q(value__gt=0))
Run Code Online (Sandbox Code Playgroud)

该模型如下所示:

class Score(models.Model):
    value = models.FloatField()
    ...
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

djv*_*jvg 14

这种情况可以使用ExpressionWrapper()来修复

Score.objects.annotate(
    positive=ExpressionWrapper(Q(value__gt=0), output_field=BooleanField()))
Run Code Online (Sandbox Code Playgroud)

来自文档:

ExpressionWrapperF()在不同类型的表达式上使用算术时是必要的......

尽管我在文档Q中找不到任何明确的引用,但对象显然也是如此。