Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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
  • Loading branch information...
commit 1006d6eb06e202a5060d7346973a3dbc3bd0ec53 1 parent aa11b3e
Malcolm Tredinnick malcolmt authored
7 django/db/models/query.py
View
@@ -182,7 +182,12 @@ def count(self):
counter._select_related = False
select, sql, params = counter._get_sql_clause()
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]
def get(self, *args, **kwargs):
7 tests/modeltests/many_to_many/models.py
View
@@ -82,6 +82,13 @@ class Meta:
>>> Article.objects.filter(publications__title__startswith="Science").distinct()
[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
# have a ManyToManyField).
>>> Publication.objects.filter(id__exact=1)
6 tests/modeltests/many_to_one/models.py
View
@@ -205,6 +205,12 @@ class Meta:
>>> Reporter.objects.filter(article__headline__startswith='This').distinct()
[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.
>>> Reporter.objects.filter(article__reporter__first_name__startswith='John')
[John Smith, John Smith, John Smith, John Smith]
Please sign in to comment.
Something went wrong with that request. Please try again.