Hi,
when using 'aggregate(Sum(...))' on a queryset that is also using
'distinct()', 'DISTINCT' is misplaced in resulting SQL query...

Here is a silly sample code:

I have the following classes:
class Son(models.Model):
        name = models.CharField(max_length=20)

        def __unicode__(self):
                return self.name

class Father(models.Model):
        name = models.CharField(max_length=20)
        age = models.IntegerField()
        sons = models.ManyToManyField(Son)

        def __unicode__(self):
                return '%s - %s' %(self.name, self.age)

I want to compute the total age of fathers who have a son called Adam
or Bernard:

so:

>>> f = Father.objects.create(name='Chris', age=30)
>>> adam = f.sons.create(name='Adam')
>>> bernard = f.sons.create(name='Bernard')
>>> f.sons.all() #Check that everything is ok
[<Son: Bernard>, <Son: Adam>]

>>> Father.objects.filter(sons__in=[adam, bernard]) #Let's see the fathers that 
>>> have either Adam or Bernard among their sons
[<Father: Chris - 30>, <Father: Chris - 30>]

>>> Father.objects.filter(sons__in=[adam, bernard]).distinct() #Since Chris 
>>> have both, he appears twice; so, I have to apply 'distinct'
[<Father: Chris - 30>]

>>> Father.objects.filter(sons__in=[adam, 
>>> bernard]).distinct().aggregate(Sum('age'))  #Let's see the total age...
{'age__sum': 60}

I think this is an error: the total age should be 30...

The SQL query is:
>>> from django.db import connection
>>> connection.queries[-1]
{'time': '0.000',
'sql': u'SELECT DISTINCT SUM(`testing_father`.`age`) AS `age__sum`
FROM `testing_father` INNER JOIN `testing_father_sons` ON
(`testing_father`.`id` = `testing_father_sons`.`father_id`) WHERE
`testing_father_sons`.`son_id` IN (7, 6)'}

So, Django applies DISTINCT on values already summed, while it shouls
apply DISTINCT BEFORE summing.


What do you think?

Note that my actual problem is that I have to apply aggregation on a
queryset which is provided by a 'black-box' function: the queryset is
already provided with the '__in' filter and the 'distinct' clause and
I cannot change its behaviour, nor taking distinct back...

Any suggestion?

Thanks a lot

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to