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

2ekbmq32  于 2023-01-31  发布在  Go
关注(0)|答案(2)|浏览(119)

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

AttributeError: 'WhereNode' object has no attribute 'select_format'

这是在尝试使用比较的(布尔)结果annotate() Django查询集时引发的,例如下面简化示例中的gt查找:

Score.objects.annotate(positive=Q(value__gt=0))

模型如下所示:

class Score(models.Model):
    value = models.FloatField()
    ...

如何解决这个问题?

bf1o4zei

bf1o4zei1#

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

Score.objects.annotate(
    positive=ExpressionWrapper(Q(value__gt=0), output_field=BooleanField()))

来自文档:
在不同类型的F()表达式上使用算术时,ExpressionWrapper是必需的...
这显然也适用于Q对象,尽管我在文档中找不到任何显式引用。

vecaoik1

vecaoik12#

如果您尝试过滤计数注解,并且意外地将filter子句放在了错误的位置,也会收到此错误消息。例如,如果您遵循this example,而不是写入

events = Event.objects.annotate(
    paid_participants=Count('participants', filter=Q(participants__is_paid=True))
)

就像这个例子说的你不小心写了

events = Event.objects.annotate(
    paid_participants=Count('participants'), filter=Q(participants__is_paid=True)
)  # WRONG

那么你会得到这个错误信息。这是一个愚蠢的错误,但是可能会花费你一两个小时,而且ExpressionWrapper也帮不上忙。(希望这能帮助其他人。)

相关问题