Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 3522)
+++ django/db/models/query.py	(working copy)
@@ -305,8 +305,19 @@
     # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
     ##################################################

-    def values(self, *fields):
-        return self._clone(klass=ValuesQuerySet, _fields=fields)
+    def values(self, *fields, **kwds):
+        """
+        Returns a list of dictionaries instead of object instances.  Only
+        retrieves fields listed in '*fields'.  If the keyword argument 'flat'
+        is True, returns a "flattened" list of field values.
+        """
+        if kwds:
+            assert 'flat' in kwds, "only accepts keyword argument 'flat'"
+            assert kwds['flat'] in (True, False), "keyword argument 'flat' must be either True or False"
+            flat = kwds['flat']
+        else:
+            flat = False
+        return self._clone(klass=ValuesQuerySet, _fields=fields, _flat=flat)

     def dates(self, field_name, kind, order='ASC'):
         """
@@ -531,11 +542,21 @@
             if not rows:
                 raise StopIteration
             for row in rows:
-                yield dict(zip(field_names, row))
+                # if self._flat is True, return a "flattened" list of
+                # field values as a plain list or a list of tuples
+                if self._flat:
+                    if len(field_names) == 1:
+                        yield row[0]
+                    else:
+                        yield tuple(row)
+                # otherwise, return a dict of field names and values
+                else:
+                    yield dict(zip(field_names, row))

     def _clone(self, klass=None, **kwargs):
         c = super(ValuesQuerySet, self)._clone(klass, **kwargs)
         c._fields = self._fields[:]
+        c._flat = self._flat
         return c

 class DateQuerySet(QuerySet):
Index: tests/modeltests/lookup/models.py
===================================================================
--- tests/modeltests/lookup/models.py	(revision 3522)
+++ tests/modeltests/lookup/models.py	(working copy)
@@ -124,6 +124,23 @@
 >>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
 True

+# if you specify only one field and pass the keyword argument flat=True, a
+# plain list of field values is returned
+>>> list(Article.objects.order_by('id').values('id', flat=True)) == [1, 2, 3, 4, 5, 6, 7]
+True
+
+# if you specify more than one field and pass the keyword argument flat=True,
+# a list of tuples of field values is returned
+>>> for t in Article.objects.order_by('id').values('id', 'headline', flat=True):
+...     t
+(1, 'Article 1')
+(2, 'Article 2')
+(3, 'Article 3')
+(4, 'Article 4')
+(5, 'Article 5')
+(6, 'Article 6')
+(7, 'Article 7')
+
 # Every DateField and DateTimeField creates get_next_by_FOO() and
 # get_previous_by_FOO() methods.
 # In the case of identical date values, these methods will use the ID as a
