6

I have a question about how we can filter by SUM of multiple columns.

Example:

class Foo(models.Model):
    i1 = models.IntegerField()
    i2 = models.IntegerField()
    i3 = models.IntegerField()

And I need to filter objects where SUM of i1, i2, i3 is less then 200. I've tried achive it with:

Foo.objects.agregate(i_sum=Sum(i1,i2,i3)).filter(i_sum__lt=200) # error
Foo.objects.agregate(i_sum=Sum([i1,i2,i3])).filter(i_sum__lt=200) # error

Thanks.

wowbrowser search
  • 345
  • 1
  • 3
  • 11

2 Answers2

14

You can use F(), and with annotation:

Foo.objects.annotate(i_sum=F('i1') + F('i2')+ F('i3')).filter(i_sum=200)
Wilfried
  • 1,623
  • 1
  • 12
  • 19
0

You can use extra

Foo.objects.extra(where=["i1 + i2 + i3 > 200"])
itzMEonTV
  • 19,851
  • 4
  • 39
  • 49