Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 4118)
+++ django/db/models/query.py	(working copy)
@@ -533,6 +533,31 @@
             for row in rows:
                 yield dict(zip(field_names, row))
 
+    def count(self):
+        "Performs a SELECT COUNT() and returns the number of records as an integer."
+        counter = self._clone()
+        counter._order_by = ()
+        counter._offset = None
+        counter._limit = None
+        counter._select_related = False
+        select, sql, params = counter._get_sql_clause()
+        cursor = connection.cursor()
+
+        # self._fields is a list of field names to fetch.
+        if self._fields:
+            columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
+            column_names = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
+            select_spec = ', '.join(column_names)
+        else: # Default to id_col
+            select_spec = "%s.%s" % (backend.quote_name(self.model._meta.db_table),
+                    backend.quote_name(self.model._meta.pk.column))
+
+        if self._distinct:
+            cursor.execute("SELECT COUNT(DISTINCT(%s))" % select_spec + sql, params)
+        else:
+            cursor.execute("SELECT COUNT(*)" + sql, params)
+        return cursor.fetchone()[0]
+
     def _clone(self, klass=None, **kwargs):
         c = super(ValuesQuerySet, self)._clone(klass, **kwargs)
         c._fields = self._fields[:]
