Skip to content

Commit 09da727

Browse files
committed
fetch database converters once per query rather than for each result
1 parent 0106ad1 commit 09da727

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

django_mongodb/compiler.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,23 @@ def results_iter(
5454
except EmptyResultSet:
5555
results = []
5656

57+
converters = self.get_converters(columns)
5758
for entity in results:
58-
yield self._make_result(entity, columns, tuple_expected=tuple_expected)
59+
yield self._make_result(entity, columns, converters, tuple_expected=tuple_expected)
5960

6061
def has_results(self):
6162
return bool(self.get_count(check_exists=True))
6263

63-
def _make_result(self, entity, columns, tuple_expected=False):
64+
def get_converters(self, columns):
65+
converters = {}
66+
for column in columns:
67+
backend_converters = self.connection.ops.get_db_converters(column)
68+
field_converters = column.field.get_db_converters(self.connection)
69+
if backend_converters or field_converters:
70+
converters[column.target.column] = backend_converters + field_converters
71+
return converters
72+
73+
def _make_result(self, entity, columns, converters, tuple_expected=False):
6474
"""
6575
Decode values for the given fields from the database entity.
6676
@@ -74,12 +84,9 @@ def _make_result(self, entity, columns, tuple_expected=False):
7484
value = entity.get(column, NOT_PROVIDED)
7585
if value is NOT_PROVIDED:
7686
value = field.get_default()
77-
else:
87+
elif converters:
7888
# Decode values using Django's database converters API.
79-
converters = self.connection.ops.get_db_converters(col) + field.get_db_converters(
80-
self.connection
81-
)
82-
for converter in converters:
89+
for converter in converters.get(column, ()):
8390
value = converter(value, col, self.connection)
8491
result.append(value)
8592
if tuple_expected:

0 commit comments

Comments
 (0)