Django查询 - 具有聚合功能的"case when"

Lin*_*Lin 9 django django-models

我有以下django模型(映射到表'A'):

class A(models.Model):
    name = models.CharField(max_length=64, null=False)
    value = models.IntegerField()
    ...
Run Code Online (Sandbox Code Playgroud)

我想在顶部执行以下简单查询:

select avg(case 
        when (value > 0 and value <= 50) then 0 
        when (value > 50 and value < 70) then 50 
        else 100 end) 
from A
where ...
Run Code Online (Sandbox Code Playgroud)

我试图避免原始SQL - 如何使用django实现(在上面的例子中我使用avg,但同样的问题也与max,min,sum等相关)?

我尝试使用额外和聚合:

extra(select={'avg_field': case_when_query})
Run Code Online (Sandbox Code Playgroud)

aggregate(Avg('avg_field')), 
Run Code Online (Sandbox Code Playgroud)

但是聚合函数仅适用于模型字段,因此此处不能使用额外字段.如何用django完成?

谢谢您的帮助

Lin*_*Lin 5

仍然可以使我们使用Django queryset的事情是这样的:

qs = A.objects.extra(select={"avg_field": 
                     "avg(case when...)"}).filter(...).values("avg_field")
Run Code Online (Sandbox Code Playgroud)

要使用结果:

qs[0]["avg_field"]
Run Code Online (Sandbox Code Playgroud)

这将允许所需的功能。