Fixed #1530 -- make count() respect distinct() on QuerySets. Create some

tests for this as well. Thanks to Adam Endicott for the original patch on which
this is based.



git-svn-id: http://code.djangoproject.com/svn/django/trunk@2902 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2006-05-14 23:49:29 +00:00
parent aa11b3ea50
commit 1006d6eb06
3 changed files with 19 additions and 1 deletions

View File

@ -182,7 +182,12 @@ class QuerySet(object):
counter._select_related = False counter._select_related = False
select, sql, params = counter._get_sql_clause() select, sql, params = counter._get_sql_clause()
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("SELECT COUNT(*)" + sql, params) if self._distinct:
id_col = "%s.%s" % (backend.quote_name(self.model._meta.db_table),
backend.quote_name(self.model._meta.pk.column))
cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params)
else:
cursor.execute("SELECT COUNT(*)" + sql, params)
return cursor.fetchone()[0] return cursor.fetchone()[0]
def get(self, *args, **kwargs): def get(self, *args, **kwargs):

View File

@ -82,6 +82,13 @@ API_TESTS = """
>>> Article.objects.filter(publications__title__startswith="Science").distinct() >>> Article.objects.filter(publications__title__startswith="Science").distinct()
[NASA uses Python] [NASA uses Python]
# The count() function respects distinct() as well.
>>> Article.objects.filter(publications__title__startswith="Science").count()
2
>>> Article.objects.filter(publications__title__startswith="Science").distinct().count()
1
# Reverse m2m queries are supported (i.e., starting at the table that doesn't # Reverse m2m queries are supported (i.e., starting at the table that doesn't
# have a ManyToManyField). # have a ManyToManyField).
>>> Publication.objects.filter(id__exact=1) >>> Publication.objects.filter(id__exact=1)

View File

@ -205,6 +205,12 @@ John Smith
>>> Reporter.objects.filter(article__headline__startswith='This').distinct() >>> Reporter.objects.filter(article__headline__startswith='This').distinct()
[John Smith] [John Smith]
# Counting in the opposite direction works in conjunction with distinct()
>>> Reporter.objects.filter(article__headline__startswith='This').count()
3
>>> Reporter.objects.filter(article__headline__startswith='This').distinct().count()
1
# Queries can go round in circles. # Queries can go round in circles.
>>> Reporter.objects.filter(article__reporter__first_name__startswith='John') >>> Reporter.objects.filter(article__reporter__first_name__startswith='John')
[John Smith, John Smith, John Smith, John Smith] [John Smith, John Smith, John Smith, John Smith]