Skip to content

Commit

Permalink
Fixed #3463 -- EmptyQuerySet's iterator() now returns a generator. Th…
Browse files Browse the repository at this point in the history
…anks, Gary Wilson

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4475 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
adrianholovaty committed Feb 10, 2007
1 parent 1aa1c46 commit 007f17d
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 17 deletions.
34 changes: 17 additions & 17 deletions django/db/models/query.py
Expand Up @@ -167,17 +167,16 @@ def __or__(self, other):

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)
Expand Down Expand Up @@ -523,27 +522,28 @@ def _get_sql_clause(self):
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]
field_names = self._fields
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)
Expand Down Expand Up @@ -592,9 +592,6 @@ def __init__(self, model=None):
super(EmptyQuerySet, self).__init__(model)
self._result_cache = []

def iterator(self):
raise StopIteration

def count(self):
return 0

Expand All @@ -606,6 +603,9 @@ def _clone(self, klass=None, **kwargs):
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):
Expand Down
2 changes: 2 additions & 0 deletions tests/modeltests/lookup/models.py
Expand Up @@ -198,6 +198,8 @@ def __str__(self):
[]
>>> 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=[])
Expand Down

0 comments on commit 007f17d

Please sign in to comment.