Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class A(models.Model):
- name = models.CharField(max_length=64, null=False)
- value = models.IntegerField()
- ...
- 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 ...
- extra(select={'avg_field': case_when_query})
- aggregate(Avg('avg_field')),
- qs = A.objects.extra(select={"avg_field":
- "avg(case when...)"}).filter(...).values("avg_field")
- qs[0]["avg_field"]
- class A(models.Model):
- name = models.CharField(max_length=64, null=False)
- value = models.IntegerField()
- average_field = models.IntegerField(default = 0)
- def _get_average_field(self):
- # Trying to match the case statement's syntax.
- # You can also do 0 < self.value <= 50
- if self.value > 0 and self.value <= 50:
- return 0
- elif self.value > 50 and self.value < 70:
- return 50
- else:
- return 100
- def save(self, *args, **kwargs):
- if self.value:
- self.average_field = self._get_average_field()
- super(A, self).save(*args, **kwargs)
- A.objects.filter(...).aggregate(avg = Avg('average_field'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement