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:
parent
aa11b3ea50
commit
1006d6eb06
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Reference in New Issue