Skip to content

Commit 0309b8a

Browse files
committed
remove unnecessary $literal wrapping in Value.as_mql()
Only integers need to be wrapped.
1 parent 996aebb commit 0309b8a

File tree

2 files changed

+21
-21
lines changed

2 files changed

+21
-21
lines changed

django_mongodb/expressions.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,24 @@ def when(self, compiler, connection):
203203

204204
def value(self, compiler, connection): # noqa: ARG001
205205
value = self.value
206+
if isinstance(value, int):
207+
# Wrap numbers in $literal to prevent ambiguity when Value appears in
208+
# $project.
209+
return {"$literal": value}
206210
if isinstance(value, Decimal):
207-
value = Decimal128(value)
208-
elif isinstance(value, datetime.date):
211+
return Decimal128(value)
212+
if isinstance(value, datetime.date):
209213
# Turn dates into datetimes since BSON doesn't support dates.
210-
value = datetime.datetime.combine(value, datetime.datetime.min.time())
211-
elif isinstance(value, datetime.time):
214+
return datetime.datetime.combine(value, datetime.datetime.min.time())
215+
if isinstance(value, datetime.time):
212216
# Turn times into datetimes since BSON doesn't support times.
213-
value = datetime.datetime.combine(datetime.datetime.min.date(), value)
214-
elif isinstance(value, datetime.timedelta):
217+
return datetime.datetime.combine(datetime.datetime.min.date(), value)
218+
if isinstance(value, datetime.timedelta):
215219
# DurationField stores milliseconds rather than microseconds.
216-
value /= datetime.timedelta(milliseconds=1)
217-
elif isinstance(value, UUID):
218-
value = value.hex
219-
return {"$literal": value}
220+
return value / datetime.timedelta(milliseconds=1)
221+
if isinstance(value, UUID):
222+
return value.hex
223+
return value
220224

221225

222226
def register_expressions():

tests/expressions_/test_value.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,33 @@ class ValueTests(SimpleTestCase):
1111
def test_date(self):
1212
self.assertEqual(
1313
Value(datetime.date(2025, 1, 1)).as_mql(None, None),
14-
{"$literal": datetime.datetime(2025, 1, 1)},
14+
datetime.datetime(2025, 1, 1),
1515
)
1616

1717
def test_datetime(self):
1818
self.assertEqual(
1919
Value(datetime.datetime(2025, 1, 1, 9, 8, 7)).as_mql(None, None),
20-
{"$literal": datetime.datetime(2025, 1, 1)},
20+
datetime.datetime(2025, 1, 1),
2121
)
2222

2323
def test_decimal(self):
24-
self.assertEqual(Value(Decimal("1.0")).as_mql(None, None), {"$literal": Decimal128("1.0")})
24+
self.assertEqual(Value(Decimal("1.0")).as_mql(None, None), Decimal128("1.0"))
2525

2626
def test_time(self):
2727
self.assertEqual(
2828
Value(datetime.time(9, 8, 7)).as_mql(None, None),
29-
{"$literal": datetime.datetime(1, 1, 1, 9, 8, 7)},
29+
datetime.datetime(1, 1, 1, 9, 8, 7),
3030
)
3131

3232
def test_timedelta(self):
33-
self.assertEqual(
34-
Value(datetime.timedelta(3600)).as_mql(None, None), {"$literal": 311040000000.0}
35-
)
33+
self.assertEqual(Value(datetime.timedelta(3600)).as_mql(None, None), 311040000000.0)
3634

3735
def test_int(self):
3836
self.assertEqual(Value(1).as_mql(None, None), {"$literal": 1})
3937

4038
def test_str(self):
41-
self.assertEqual(Value("foo").as_mql(None, None), {"$literal": "foo"})
39+
self.assertEqual(Value("foo").as_mql(None, None), "foo")
4240

4341
def test_uuid(self):
4442
value = uuid.UUID(int=1)
45-
self.assertEqual(
46-
Value(value).as_mql(None, None), {"$literal": "00000000000000000000000000000001"}
47-
)
43+
self.assertEqual(Value(value).as_mql(None, None), "00000000000000000000000000000001")

0 commit comments

Comments
 (0)