Skip to content

Commit 9aadb66

Browse files
committed
Refactor get columns.
1 parent 6f30443 commit 9aadb66

File tree

2 files changed

+25
-57
lines changed

2 files changed

+25
-57
lines changed

django_mongodb/compiler.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,16 @@ def results_iter(
4444
"""
4545
columns = self.get_columns()
4646

47-
related_columns = []
4847
if results is None:
4948
# QuerySet.values() or values_list()
5049
try:
5150
results = self.build_query(columns).fetch()
5251
except EmptyResultSet:
5352
results = []
54-
else:
55-
index = len(columns)
56-
while index < self.col_count:
57-
foreign_columns = []
58-
foreign_relation = self.select[index][0].alias
59-
while index < self.col_count and foreign_relation == self.select[index][0].alias:
60-
foreign_columns.append(self.select[index][0])
61-
index += 1
62-
related_columns.append(
63-
(
64-
foreign_relation,
65-
[(column.target.column, column) for column in foreign_columns],
66-
)
67-
)
6853

6954
converters = self.get_converters(columns)
7055
for entity in results:
71-
yield self._make_result(
72-
entity, columns, related_columns, converters, tuple_expected=tuple_expected
73-
)
56+
yield self._make_result(entity, columns, converters, tuple_expected=tuple_expected)
7457

7558
def has_results(self):
7659
return bool(self.get_count(check_exists=True))
@@ -89,17 +72,14 @@ def get_converters(self, expressions):
8972
converters[name] = backend_converters + field_converters
9073
return converters
9174

92-
def _make_result(self, entity, columns, related_columns, converters, tuple_expected=False):
75+
def _make_result(self, entity, columns, converters, tuple_expected=False):
9376
"""
9477
Decode values for the given fields from the database entity.
9578
9679
The entity is assumed to be a dict using field database column
9780
names as keys.
9881
"""
9982
result = self._apply_converters(entity, columns, converters)
100-
# Related columns.
101-
for relation, columns in related_columns:
102-
result += self._apply_converters(entity[relation], columns, converters)
10383
if tuple_expected:
10484
result = tuple(result)
10585
return result
@@ -108,7 +88,12 @@ def _apply_converters(self, entity, columns, converters):
10888
result = []
10989
for name, col in columns:
11090
field = col.field
111-
value = entity.get(name, NOT_PROVIDED)
91+
obj = (
92+
entity.get(col.alias, {})
93+
if hasattr(col, "alias") and col.alias != self.collection_name
94+
else entity
95+
)
96+
value = obj.get(name, NOT_PROVIDED)
11297
if value is NOT_PROVIDED:
11398
value = field.get_default()
11499
elif converters:
@@ -173,9 +158,17 @@ def get_columns(self):
173158
columns = (
174159
self.get_default_columns(select_mask) if self.query.default_cols else self.query.select
175160
)
161+
162+
related_columns = []
163+
if self.query.select_related:
164+
self.get_related_selections(related_columns, select_mask)
165+
if related_columns:
166+
related_columns, _ = zip(*related_columns, strict=True)
167+
176168
annotation_idx = 1
177-
result = []
178-
for column in columns:
169+
170+
def project_field(column):
171+
nonlocal annotation_idx
179172
if hasattr(column, "target"):
180173
# column is a Col.
181174
target = column.target.column
@@ -184,8 +177,13 @@ def get_columns(self):
184177
# name for $proj.
185178
target = f"__annotation{annotation_idx}"
186179
annotation_idx += 1
187-
result.append((target, column))
188-
return tuple(result) + tuple(self.query.annotation_select.items())
180+
return target, column
181+
182+
return (
183+
tuple(map(project_field, columns))
184+
+ tuple(self.query.annotation_select.items())
185+
+ tuple(map(project_field, related_columns))
186+
)
189187

190188
def _get_ordering(self):
191189
"""

django_mongodb/features.py

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,8 @@ def django_test_expected_failures(self):
156156
"model_fields.test_autofield.SmallAutoFieldTests",
157157
},
158158
"QuerySet.select_related() not supported.": {
159-
"annotations.tests.AliasTests.test_joined_alias_annotation",
160-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_annotation",
161-
"defer.tests.DeferTests.test_defer_foreign_keys_are_deferred_and_not_traversed",
162-
"defer.tests.DeferTests.test_defer_with_select_related",
163-
"defer.tests.DeferTests.test_only_with_select_related",
164-
"defer.tests.TestDefer2.test_defer_proxy",
165-
"defer_regress.tests.DeferRegressionTest.test_basic",
166159
"defer_regress.tests.DeferRegressionTest.test_common_model_different_mask",
167-
"model_fields.test_booleanfield.BooleanFieldTests.test_select_related",
168-
"model_fields.test_foreignkey.ForeignKeyTests.test_empty_string_fk",
169160
"defer_regress.tests.DeferRegressionTest.test_defer_annotate_select_related",
170-
"defer_regress.tests.DeferRegressionTest.test_defer_with_select_related",
171-
"defer_regress.tests.DeferRegressionTest.test_only_with_select_related",
172-
"defer_regress.tests.DeferRegressionTest.test_proxy_model_defer_with_select_related",
173161
"defer_regress.tests.DeferRegressionTest.test_reverse_one_to_one_relations",
174162
"defer_regress.tests.DeferRegressionTest.test_ticket_23270",
175163
},
@@ -296,23 +284,13 @@ def django_test_expected_failures(self):
296284
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_and_alias_filter_related_in_subquery",
297285
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
298286
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_reverse_m2m",
299-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_transformed_annotation",
300287
"annotations.tests.NonAggregateAnnotationTestCase.test_mti_annotations",
301288
"annotations.tests.NonAggregateAnnotationTestCase.test_values_with_pk_annotation",
302289
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
303290
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_with_m2m",
304291
"annotations.tests.NonAggregateAnnotationTestCase.test_chaining_annotation_filter_with_m2m",
305292
"db_functions.comparison.test_least.LeastTests.test_related_field",
306293
"db_functions.comparison.test_greatest.GreatestTests.test_related_field",
307-
"defer.tests.BigChildDeferTests.test_defer_baseclass_when_subclass_has_added_field",
308-
"defer.tests.BigChildDeferTests.test_defer_subclass",
309-
"defer.tests.BigChildDeferTests.test_defer_subclass_both",
310-
"defer.tests.BigChildDeferTests.test_only_baseclass_when_subclass_has_added_field",
311-
"defer.tests.BigChildDeferTests.test_only_subclass",
312-
"defer.tests.DeferTests.test_defer_baseclass_when_subclass_has_no_added_fields",
313-
"defer.tests.DeferTests.test_defer_of_overridden_scalar",
314-
"defer.tests.DeferTests.test_only_baseclass_when_subclass_has_no_added_fields",
315-
"defer.tests.TestDefer2.test_defer_inheritance_pk_chaining",
316294
"defer_regress.tests.DeferRegressionTest.test_ticket_16409",
317295
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_condition",
318296
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_predicate",
@@ -324,9 +302,6 @@ def django_test_expected_failures(self):
324302
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_condition",
325303
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_predicate",
326304
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_value",
327-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_condition",
328-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_predicate",
329-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_value",
330305
"expressions_case.tests.CaseExpressionTests.test_join_promotion",
331306
"expressions_case.tests.CaseExpressionTests.test_join_promotion_multiple_annotations",
332307
"expressions_case.tests.CaseExpressionTests.test_m2m_exclude",
@@ -336,19 +311,14 @@ def django_test_expected_failures(self):
336311
"lookup.tests.LookupTests.test_filter_by_reverse_related_field_transform",
337312
"lookup.tests.LookupTests.test_lookup_collision",
338313
"lookup.tests.LookupTests.test_lookup_rhs",
339-
"lookup.tests.LookupTests.test_isnull_non_boolean_value",
340314
"model_fields.test_jsonfield.TestQuerying.test_join_key_transform_annotation_expression",
341-
"model_fields.test_manytomanyfield.ManyToManyFieldDBTests.test_value_from_object_instance_with_pk",
342-
"model_fields.test_uuid.TestAsPrimaryKey.test_two_level_foreign_keys",
343315
"timezones.tests.LegacyDatabaseTests.test_query_annotation",
344316
"timezones.tests.NewDatabaseTests.test_query_annotation",
345317
"update.tests.AdvancedTests.test_update_annotated_multi_table_queryset",
346-
"update.tests.AdvancedTests.test_update_fk",
347318
"update.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotation",
348319
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation",
349320
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
350321
"update.tests.SimpleTest.test_empty_update_with_inheritance",
351-
"update.tests.SimpleTest.test_foreign_key_update_with_id",
352322
"update.tests.SimpleTest.test_nonempty_update_with_inheritance",
353323
},
354324
"Test inspects query for SQL": {

0 commit comments

Comments
 (0)