Skip to content

Commit 326a5e2

Browse files
committed
Fix handling of $-prefixed string values during save
1 parent 0e0cdb0 commit 326a5e2

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

django_mongodb_backend/compiler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,8 @@ def execute_sql(self, result_type):
885885
prepared = field.get_db_prep_save(value, connection=self.connection)
886886
if hasattr(value, "as_mql"):
887887
prepared = prepared.as_mql(self, self.connection, as_expr=True)
888+
if is_direct_value(value):
889+
prepared = {"$literal": prepared}
888890
values[field.column] = prepared
889891
try:
890892
criteria = self.build_query().match_mql

django_mongodb_backend/expressions/builtins.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@ def when(self, compiler, connection):
211211

212212
def value(self, compiler, connection, as_expr=False): # noqa: ARG001
213213
value = self.value
214-
if isinstance(value, (list, int)) and as_expr:
215-
# Wrap lists & numbers in $literal to prevent ambiguity when Value
216-
# appears in $project.
214+
if isinstance(value, (list, int, str)) and as_expr:
215+
# Wrap lists, numbers, & string in $literal to prevent ambiguity when Value
216+
# appears in $project or $update.
217217
return {"$literal": value}
218218
if isinstance(value, Decimal):
219219
return Decimal128(value)

django_mongodb_backend/test.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,18 @@ def assertAggregateQuery(self, query, expected_collection, expected_pipeline):
1919
eval(pipeline[:-1], {"SON": SON, "ObjectId": ObjectId, "Decimal128": Decimal128}, {}), # noqa: S307
2020
expected_pipeline,
2121
)
22+
23+
def assertUpdateQuery(self, query, expected_collection, expected_pipeline, new_values):
24+
"""
25+
Assert that the logged query is equal to:
26+
db.{expected_collection}.aggregate({expected_pipeline})
27+
"""
28+
prefix, pipeline = query.split("(", 1)
29+
_, collection, operator = prefix.split(".")
30+
self.assertEqual(operator, "update_many")
31+
self.assertEqual(collection, expected_collection)
32+
condition, values = eval( # noqa: S307
33+
pipeline[:-1], {"SON": SON, "ObjectId": ObjectId, "Decimal128": Decimal128}, {}
34+
)
35+
self.assertEqual(condition, expected_pipeline)
36+
self.assertEqual(values, new_values)

0 commit comments

Comments
 (0)