Skip to content

Commit 83e9e2c

Browse files
committed
INTPYTHON-599 Make a field's custom transforms available in embedded model queries
1 parent 79f2a40 commit 83e9e2c

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

django_mongodb_backend/fields/embedded_model.py

+13-16
Original file line numberDiff line numberDiff line change
@@ -163,26 +163,23 @@ def get_transform(self, name):
163163
Validate that `name` is either a field of an embedded model or a
164164
lookup on an embedded model's field.
165165
"""
166-
result = None
167166
if isinstance(self.ref_field, EmbeddedModelField):
168167
opts = self.ref_field.embedded_model._meta
169168
new_field = opts.get_field(name)
170-
result = KeyTransformFactory(name, new_field)
169+
return KeyTransformFactory(name, new_field)
170+
if transform := self.ref_field.get_transform(name):
171+
return transform
172+
suggested_lookups = difflib.get_close_matches(name, self.ref_field.get_lookups())
173+
if suggested_lookups:
174+
suggested_lookups = " or ".join(suggested_lookups)
175+
suggestion = f", perhaps you meant {suggested_lookups}?"
171176
else:
172-
if self.ref_field.get_transform(name) is None:
173-
suggested_lookups = difflib.get_close_matches(name, self.ref_field.get_lookups())
174-
if suggested_lookups:
175-
suggested_lookups = " or ".join(suggested_lookups)
176-
suggestion = f", perhaps you meant {suggested_lookups}?"
177-
else:
178-
suggestion = "."
179-
raise FieldDoesNotExist(
180-
f"Unsupported lookup '{name}' for "
181-
f"{self.ref_field.__class__.__name__} '{self.ref_field.name}'"
182-
f"{suggestion}"
183-
)
184-
result = KeyTransformFactory(name, self.ref_field)
185-
return result
177+
suggestion = "."
178+
raise FieldDoesNotExist(
179+
f"Unsupported lookup '{name}' for "
180+
f"{self.ref_field.__class__.__name__} '{self.ref_field.name}'"
181+
f"{suggestion}"
182+
)
186183

187184
def preprocess_lhs(self, compiler, connection):
188185
previous = self

docs/source/releases/5.1.x.rst

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ Django MongoDB Backend 5.1.x
77

88
*Unreleased*
99

10-
- Added support for a field's custom lookups in ``EmbeddedModelField``, e.g.
11-
``ArrayField``’s ``contains``, ``contained__by``, etc.
10+
- Added support for a field's custom lookups and transforms in
11+
``EmbeddedModelField``, e.g. ``ArrayField``’s ``contains``,
12+
``contained__by``, ``len``, etc.
1213

1314
.. _django-mongodb-backend-5.1.0-beta-2:
1415

docs/source/releases/5.2.x.rst

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ Regarding new features in Django 5.2,
1515

1616
Bug fixes:
1717

18-
- Added support for a field's custom lookups in ``EmbeddedModelField``, e.g.
19-
``ArrayField``’s ``contains``, ``contained__by``, etc.
18+
- Added support for a field's custom lookups and transforms in
19+
``EmbeddedModelField``, e.g. ``ArrayField``’s ``contains``,
20+
``contained__by``, ``len``, etc.

tests/model_fields_/test_embedded_model.py

+7
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,13 @@ def test_contained_by(self):
228228
[self.book],
229229
)
230230

231+
def test_len(self):
232+
self.assertCountEqual(Book.objects.filter(author__skills__len=1), [])
233+
self.assertCountEqual(Book.objects.filter(author__skills__len=2), [self.book])
234+
# Nested
235+
self.assertCountEqual(Book.objects.filter(author__address__tags__len=1), [])
236+
self.assertCountEqual(Book.objects.filter(author__address__tags__len=2), [self.book])
237+
231238

232239
class InvalidLookupTests(SimpleTestCase):
233240
def test_invalid_field(self):

0 commit comments

Comments
 (0)