mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	#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:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user