Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. class A(models.Model):
  2. name = models.CharField(max_length=64, null=False)
  3. value = models.IntegerField()
  4. ...
  5.  
  6. select avg(case
  7. when (value > 0 and value <= 50) then 0
  8. when (value > 50 and value < 70) then 50
  9. else 100 end)
  10. from A
  11. where ...
  12.  
  13. extra(select={'avg_field': case_when_query})
  14.  
  15. aggregate(Avg('avg_field')),
  16.  
  17. qs = A.objects.extra(select={"avg_field":
  18. "avg(case when...)"}).filter(...).values("avg_field")
  19.  
  20. qs[0]["avg_field"]
  21.  
  22. class A(models.Model):
  23. name = models.CharField(max_length=64, null=False)
  24. value = models.IntegerField()
  25. average_field = models.IntegerField(default = 0)
  26.  
  27. def _get_average_field(self):
  28. # Trying to match the case statement's syntax.
  29. # You can also do 0 < self.value <= 50
  30. if self.value > 0 and self.value <= 50:
  31. return 0
  32. elif self.value > 50 and self.value < 70:
  33. return 50
  34. else:
  35. return 100
  36.  
  37. def save(self, *args, **kwargs):
  38. if self.value:
  39. self.average_field = self._get_average_field()
  40. super(A, self).save(*args, **kwargs)
  41.  
  42. A.objects.filter(...).aggregate(avg = Avg('average_field'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement