=== modified file 'django/db/models/query.py'
|
|
|
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 StopIteration |
180 | | |
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 StopIteration |
545 | 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 StopIteration |
597 | | |
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): |
=== modified file 'tests/modeltests/lookup/models.py'
|
|
|
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=[]) |