Ticket #3463: iterator.diff
| File iterator.diff, 3.3 kB (added by Gary Wilson <gary.wilson@gmail.com>, 2 years ago) |
|---|
-
django/db/models/query.py
old new 167 167 168 168 def iterator(self): 169 169 "Performs the SELECT database lookup of this QuerySet." 170 try: 171 select, sql, params = self._get_sql_clause() 172 except EmptyResultSet: 173 raise StopIteration 174 170 175 # self._select is a dictionary, and dictionaries' key order is 171 176 # undefined, so we convert it to a list of tuples. 172 177 extra_select = self._select.items() 173 178 174 179 cursor = connection.cursor() 175 176 try:177 select, sql, params = self._get_sql_clause()178 except EmptyResultSet:179 raise StopIteration180 181 180 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) 182 181 fill_cache = self._select_related 183 182 index_end = len(self.model._meta.fields) … … 523 522 return select, " ".join(sql), params 524 523 525 524 class ValuesQuerySet(QuerySet): 526 def iterator(self): 525 def __init__(self, *args, **kwargs): 526 super(ValuesQuerySet, self).__init__(*args, **kwargs) 527 527 # select_related and select aren't supported in values(). 528 528 self._select_related = False 529 529 self._select = {} 530 530 531 def iterator(self): 532 try: 533 select, sql, params = self._get_sql_clause() 534 except EmptyResultSet: 535 raise StopIteration 536 531 537 # self._fields is a list of field names to fetch. 532 538 if self._fields: 533 539 columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields] … … 535 541 else: # Default to all fields. 536 542 columns = [f.column for f in self.model._meta.fields] 537 543 field_names = [f.attname for f in self.model._meta.fields] 538 539 cursor = connection.cursor()540 541 try:542 select, sql, params = self._get_sql_clause()543 except EmptyResultSet:544 raise StopIteration545 544 546 545 select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 546 cursor = connection.cursor() 547 547 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) 548 548 while 1: 549 549 rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE) … … 592 592 super(EmptyQuerySet, self).__init__(model) 593 593 self._result_cache = [] 594 594 595 def iterator(self):596 raise StopIteration597 598 595 def count(self): 599 596 return 0 600 597 … … 606 603 c._result_cache = [] 607 604 return c 608 605 606 def _get_sql_clause(self): 607 raise EmptyResultSet 608 609 609 class QOperator(object): 610 610 "Base class for QAnd and QOr" 611 611 def __init__(self, *args): -
tests/modeltests/lookup/models.py
old new 198 198 [] 199 199 >>> Article.objects.none().count() 200 200 0 201 >>> [article for article in Article.objects.none().iterator()] 202 [] 201 203 202 204 # using __in with an empty list should return an empty query set 203 205 >>> Article.objects.filter(id__in=[])
