#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:
parent
80e58b3211
commit
d123588184
|
@ -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."
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue