Ticket #2256: queryset_count.2.patch

File queryset_count.2.patch, 1.9 KB (added by Chris Beaven, 17 years ago)

with tests

  • django/db/models/query.py

     
    197197        "Performs a SELECT COUNT() and returns the number of records as an integer."
    198198        counter = self._clone()
    199199        counter._order_by = ()
     200        counter._select_related = False
     201       
     202        offset = counter._offset
     203        limit = counter._limit
    200204        counter._offset = None
    201205        counter._limit = None
    202         counter._select_related = False
    203206       
    204207        try:
    205208            select, sql, params = counter._get_sql_clause()
     
    213216            cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params)
    214217        else:
    215218            cursor.execute("SELECT COUNT(*)" + sql, params)
    216         return cursor.fetchone()[0]
     219        count = cursor.fetchone()[0]
    217220
     221        # Apply any offset and limit since using LIMIT or OFFSET in SQL doesn't
     222        # change the output of COUNT.
     223        if offset:
     224            count -= offset
     225        if limit:
     226            count = min(limit, count)
     227
     228        return count
     229
    218230    def get(self, *args, **kwargs):
    219231        "Performs the SELECT and returns a single object matching the given keyword arguments."
    220232        clone = self.filter(*args, **kwargs)
  • tests/modeltests/lookup/models.py

     
    5858>>> Article.objects.filter(headline__startswith='Blah blah').count()
    59590L
    6060
     61# count() should respect sliced query sets.
     62>>> articles = Article.objects.all()
     63>>> articles.count()
     647L
     65>>> articles[:4].count()
     664
     67>>> articles[1:100].count()
     686L
     69
    6170# Date and date/time lookups can also be done with strings.
    6271>>> Article.objects.filter(pub_date__exact='2005-07-27 00:00:00').count()
    63723L
Back to Top