#fixed #2256 -- Made count() interact with slicing on QuerySets. Patch from

SmileyChris.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@4488 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2007-02-12 00:16:17 +00:00
parent 80e58b3211
commit d123588184
2 changed files with 25 additions and 2 deletions

View File

@ -197,9 +197,12 @@ class QuerySet(object):
"Performs a SELECT COUNT() and returns the number of records as an integer." "Performs a SELECT COUNT() and returns the number of records as an integer."
counter = self._clone() counter = self._clone()
counter._order_by = () counter._order_by = ()
counter._select_related = False
offset = counter._offset
limit = counter._limit
counter._offset = None counter._offset = None
counter._limit = None counter._limit = None
counter._select_related = False
try: try:
select, sql, params = counter._get_sql_clause() select, sql, params = counter._get_sql_clause()
@ -213,7 +216,16 @@ class QuerySet(object):
cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params) cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params)
else: else:
cursor.execute("SELECT COUNT(*)" + sql, params) cursor.execute("SELECT COUNT(*)" + sql, params)
return cursor.fetchone()[0] count = cursor.fetchone()[0]
# Apply any offset and limit constraints manually, since using LIMIT or
# OFFSET in SQL doesn't change the output of COUNT.
if offset:
count = max(0, count - offset)
if limit:
count = min(limit, count)
return count
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
"Performs the SELECT and returns a single object matching the given keyword arguments." "Performs the SELECT and returns a single object matching the given keyword arguments."

View File

@ -58,6 +58,17 @@ Article 4
>>> Article.objects.filter(headline__startswith='Blah blah').count() >>> Article.objects.filter(headline__startswith='Blah blah').count()
0L 0L
# count() should respect sliced query sets.
>>> articles = Article.objects.all()
>>> articles.count()
7L
>>> articles[:4].count()
4
>>> articles[1:100].count()
6L
>>> articles[10:100].count()
0
# Date and date/time lookups can also be done with strings. # Date and date/time lookups can also be done with strings.
>>> Article.objects.filter(pub_date__exact='2005-07-27 00:00:00').count() >>> Article.objects.filter(pub_date__exact='2005-07-27 00:00:00').count()
3L 3L