Skip to content

Commit 51c8912

Browse files
committed
Edits.
1 parent c1b41ac commit 51c8912

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

django_mongodb_backend/compiler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ def execute_sql(self, result_type):
884884
)
885885
prepared = field.get_db_prep_save(value, connection=self.connection)
886886
if is_direct_value(value):
887-
prepared = {"$literal": prepared} if isinstance(value, str) else prepared
887+
prepared = {"$literal": prepared}
888888
else:
889889
prepared = prepared.as_mql(self, self.connection, as_expr=True)
890890
values[field.column] = prepared

django_mongodb_backend/expressions/builtins.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ 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, str)) and as_expr:
215-
# Wrap lists, numbers, and strings in $literal to avoid ambiguity when Value
214+
if isinstance(value, (list, int, str, dict, tuple)) and as_expr:
215+
# Wrap lists, numbers, strings, dict and tuple in $literal to avoid ambiguity when Value
216216
# is used in queries' aggregate or update_many's $set.
217217
return {"$literal": value}
218218
if isinstance(value, Decimal):

tests/basic_/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@ class Author(models.Model):
66

77
def __str__(self):
88
return self.name
9+
10+
11+
class Book(models.Model):
12+
name = models.CharField(max_length=10)
13+
data = models.JSONField(null=True)

tests/basic_/tests.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from django_mongodb_backend.test import MongoTestCaseMixin
55

6-
from .models import Author
6+
from .models import Author, Book
77

88

99
class SaveDollarPrefixTests(MongoTestCaseMixin, TestCase):
@@ -45,6 +45,38 @@ def test_update_dollar_prefix_in_value_expression(self):
4545
[{"$set": {"name": {"$literal": "$updated"}}}],
4646
)
4747

48+
def test_update_dict_value(self):
49+
"""MQL-like dict Value() expressions are correctly handled on update."""
50+
obj = Book.objects.create(name="foobar", data={})
51+
obj.data = Value({"$concat": ["$name", "-", "$name"]})
52+
obj.save()
53+
obj.refresh_from_db()
54+
self.assertEqual(obj.data, {"$concat": ["$name", "-", "$name"]})
55+
56+
def test_update_dict(self):
57+
"""MQL-like dict updates are correctly handled on update."""
58+
obj = Book.objects.create(name="foobar")
59+
obj.data = {"$concat": ["$name", "-", "$name"]}
60+
obj.save()
61+
obj.refresh_from_db()
62+
self.assertEqual(obj.data, {"$concat": ["$name", "-", "$name"]})
63+
64+
def test_update_tuple(self):
65+
"""MQL-like tuple updates are correctly handled on update."""
66+
obj = Book.objects.create(name="foobar")
67+
obj.data = ("$name", "-", "$name")
68+
obj.save()
69+
obj.refresh_from_db()
70+
self.assertEqual(obj.data, ["$name", "-", "$name"])
71+
72+
def test_update_tuple_value(self):
73+
"""MQL-like tuple Value() expressions are correctly handled on update."""
74+
obj = Book.objects.create(name="foobar")
75+
obj.data = Value(("$name", "-", "$name"))
76+
obj.save()
77+
obj.refresh_from_db()
78+
self.assertEqual(obj.data, ["$name", "-", "$name"])
79+
4880

4981
class QueryDollarPrefixTests(MongoTestCaseMixin, TestCase):
5082
def test_query_injection(self):

0 commit comments

Comments
 (0)