Author: adrian
Date: 2007-02-09 23:38:38 -0600 (Fri, 09 Feb 2007)
New Revision: 4475
Modified:
django/trunk/django/db/models/query.py
django/trunk/tests/modeltests/lookup/models.py
Log:
Fixed #3463 -- EmptyQuerySet's iterator() now returns a generator. Thanks, Gary
Wilson
Modified: django/trunk/django/db/models/query.py
===================================================================
--- django/trunk/django/db/models/query.py 2007-02-10 05:22:12 UTC (rev
4474)
+++ django/trunk/django/db/models/query.py 2007-02-10 05:38:38 UTC (rev
4475)
@@ -167,17 +167,16 @@
def iterator(self):
"Performs the SELECT database lookup of this QuerySet."
+ try:
+ select, sql, params = self._get_sql_clause()
+ except EmptyResultSet:
+ raise StopIteration
+
# self._select is a dictionary, and dictionaries' key order is
# undefined, so we convert it to a list of tuples.
extra_select = self._select.items()
cursor = connection.cursor()
-
- try:
- select, sql, params = self._get_sql_clause()
- except EmptyResultSet:
- raise StopIteration
-
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") +
",".join(select) + sql, params)
fill_cache = self._select_related
index_end = len(self.model._meta.fields)
@@ -523,11 +522,18 @@
return select, " ".join(sql), params
class ValuesQuerySet(QuerySet):
- def iterator(self):
+ def __init__(self, *args, **kwargs):
+ super(ValuesQuerySet, self).__init__(*args, **kwargs)
# select_related and select aren't supported in values().
self._select_related = False
self._select = {}
+ def iterator(self):
+ try:
+ select, sql, params = self._get_sql_clause()
+ except EmptyResultSet:
+ raise StopIteration
+
# 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]
@@ -535,15 +541,9 @@
else: # Default to all fields.
columns = [f.column for f in self.model._meta.fields]
field_names = [f.attname for f in self.model._meta.fields]
-
- cursor = connection.cursor()
- try:
- select, sql, params = self._get_sql_clause()
- except EmptyResultSet:
- raise StopIteration
-
select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table),
backend.quote_name(c)) for c in columns]
+ cursor = connection.cursor()
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") +
",".join(select) + sql, params)
while 1:
rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
@@ -592,9 +592,6 @@
super(EmptyQuerySet, self).__init__(model)
self._result_cache = []
- def iterator(self):
- raise StopIteration
-
def count(self):
return 0
@@ -606,6 +603,9 @@
c._result_cache = []
return c
+ def _get_sql_clause(self):
+ raise EmptyResultSet
+
class QOperator(object):
"Base class for QAnd and QOr"
def __init__(self, *args):
Modified: django/trunk/tests/modeltests/lookup/models.py
===================================================================
--- django/trunk/tests/modeltests/lookup/models.py 2007-02-10 05:22:12 UTC
(rev 4474)
+++ django/trunk/tests/modeltests/lookup/models.py 2007-02-10 05:38:38 UTC
(rev 4475)
@@ -198,6 +198,8 @@
[]
>>> Article.objects.none().count()
0
+>>> [article for article in Article.objects.none().iterator()]
+[]
# using __in with an empty list should return an empty query set
>>> Article.objects.filter(id__in=[])
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---