@@ -23,14 +23,18 @@ def execute_sql(
23
23
# QuerySet.count()
24
24
if self .query .annotations == {"__count" : Count ("*" )}:
25
25
return [self .get_count ()]
26
- # Specify columns if there are any annotations so that annotations are
27
- # computed via $project.
28
- columns = self .get_columns () if self .query .annotations else None
26
+
27
+ columns = self .get_columns ()
29
28
try :
30
29
query = self .build_query (columns )
31
30
except EmptyResultSet :
32
31
return None
33
- return query .fetch ()
32
+
33
+ return (
34
+ (self ._make_result (row , columns ) for row in query .fetch ())
35
+ if result_type == MULTI
36
+ else self ._make_result (next (query .fetch ()), columns )
37
+ )
34
38
35
39
def results_iter (
36
40
self ,
@@ -43,37 +47,24 @@ def results_iter(
43
47
Return an iterator over the results from executing query given
44
48
to this compiler. Called by QuerySet methods.
45
49
"""
46
- columns = self .get_columns ()
47
50
48
51
if results is None :
49
52
# QuerySet.values() or values_list()
50
- try :
51
- results = self .build_query (columns ).fetch ()
52
- except EmptyResultSet :
53
- results = []
53
+ results = self .execute_sql (MULTI , chunked_fetch = chunked_fetch , chunk_size = chunk_size )
54
54
55
- converters = self .get_converters (columns )
56
- for entity in results :
57
- yield self ._make_result (entity , columns , converters , tuple_expected = tuple_expected )
55
+ fields = [s [0 ] for s in self .select [0 : self .col_count ]]
56
+ converters = self .get_converters (fields )
57
+ rows = results
58
+ if converters :
59
+ rows = self .apply_converters (rows , converters )
60
+ if tuple_expected :
61
+ rows = map (tuple , rows )
62
+ return rows
58
63
59
64
def has_results (self ):
60
65
return bool (self .get_count (check_exists = True ))
61
66
62
- def get_converters (self , expressions ):
63
- converters = {}
64
- for name_expr in expressions :
65
- try :
66
- name , expr = name_expr
67
- except TypeError :
68
- # e.g., Count("*")
69
- continue
70
- backend_converters = self .connection .ops .get_db_converters (expr )
71
- field_converters = expr .get_db_converters (self .connection )
72
- if backend_converters or field_converters :
73
- converters [name ] = backend_converters + field_converters
74
- return converters
75
-
76
- def _make_result (self , entity , columns , converters , tuple_expected = False ):
67
+ def _make_result (self , entity , columns ):
77
68
"""
78
69
Decode values for the given fields from the database entity.
79
70
@@ -82,7 +73,6 @@ def _make_result(self, entity, columns, converters, tuple_expected=False):
82
73
"""
83
74
result = []
84
75
for name , col in columns :
85
- field = col .field
86
76
column_alias = getattr (col , "alias" , None )
87
77
obj = (
88
78
# Use the related object...
@@ -91,16 +81,7 @@ def _make_result(self, entity, columns, converters, tuple_expected=False):
91
81
if column_alias is not None and column_alias != self .collection_name
92
82
else entity
93
83
)
94
- value = obj .get (name , NOT_PROVIDED )
95
- if value is NOT_PROVIDED :
96
- value = field .get_default ()
97
- elif converters :
98
- # Decode values using Django's database converters API.
99
- for converter in converters .get (name , ()):
100
- value = converter (value , col , self .connection )
101
- result .append (value )
102
- if tuple_expected :
103
- result = tuple (result )
84
+ result .append (obj .get (name , NOT_PROVIDED ))
104
85
return result
105
86
106
87
def check_query (self ):
@@ -239,6 +220,10 @@ def _get_ordering(self):
239
220
def collection_name (self ):
240
221
return self .query .get_meta ().db_table
241
222
223
+ @cached_property
224
+ def collection_name (self ):
225
+ return self .query .get_meta ().db_table
226
+
242
227
def get_collection (self ):
243
228
return self .connection .get_collection (self .collection_name )
244
229
0 commit comments