I have the following django model (mapped to table ‘A’):
class A(models.Model):
name = models.CharField(max_length=64, null=False)
value = models.IntegerField()
...
I want to perform the following simple query on top:
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 ...
I’m trying to avoid raw SQL – How can this be implemented with django (in the above example I’m using avg, but the same question is also relevant for max, min, sum etc.)?
I tried using extra and aggregate:
extra(select={'avg_field': case_when_query})
and
aggregate(Avg('avg_field')),
but the aggregate function only works with model fields so the extra field cannot be used here.
How can this be done with django?
Thanks for the help
What can be done that will still allow us to use django queryset is something like this:
To use the result:
And this would allow the needed functionality.