Skip to content

Commit 79f2a40

Browse files
committed
INTPYTHON-599 Make a field's custom lookups available in embedded model queries
1 parent 9ce9ef3 commit 79f2a40

File tree

5 files changed

+65
-0
lines changed

5 files changed

+65
-0
lines changed

django_mongodb_backend/fields/embedded_model.py

+7
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ def __init__(self, key_name, ref_field, *args, **kwargs):
155155
self.key_name = str(key_name)
156156
self.ref_field = ref_field
157157

158+
def get_lookup(self, name):
159+
return self.ref_field.get_lookup(name)
160+
158161
def get_transform(self, name):
159162
"""
160163
Validate that `name` is either a field of an embedded model or a
@@ -204,6 +207,10 @@ def as_mql(self, compiler, connection):
204207
result = build_json_mql_path(result, json_key_transforms)
205208
return result
206209

210+
@property
211+
def output_field(self):
212+
return self.ref_field
213+
207214

208215
class KeyTransformFactory:
209216
def __init__(self, key_name, ref_field):

docs/source/releases/5.1.x.rst

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
Django MongoDB Backend 5.1.x
33
============================
44

5+
5.1.0 beta 3
6+
============
7+
8+
*Unreleased*
9+
10+
- Added support for a field's custom lookups in ``EmbeddedModelField``, e.g.
11+
``ArrayField``’s ``contains``, ``contained__by``, etc.
12+
513
.. _django-mongodb-backend-5.1.0-beta-2:
614

715
5.1.0 beta 2

docs/source/releases/5.2.x.rst

+5
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ Initial release from the state of :ref:`django-mongodb-backend 5.1.0 beta 2
1212

1313
Regarding new features in Django 5.2,
1414
:class:`~django.db.models.CompositePrimaryKey` isn't supported.
15+
16+
Bug fixes:
17+
18+
- Added support for a field's custom lookups in ``EmbeddedModelField``, e.g.
19+
``ArrayField``’s ``contains``, ``contained__by``, etc.

tests/model_fields_/models.py

+2
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,14 @@ class Address(EmbeddedModel):
110110
city = models.CharField(max_length=20)
111111
state = models.CharField(max_length=2)
112112
zip_code = models.IntegerField(db_index=True)
113+
tags = ArrayField(models.CharField(max_length=100), null=True, blank=True)
113114

114115

115116
class Author(EmbeddedModel):
116117
name = models.CharField(max_length=10)
117118
age = models.IntegerField()
118119
address = EmbeddedModelField(Address)
120+
skills = ArrayField(models.CharField(max_length=100), null=True, blank=True)
119121

120122

121123
class Book(models.Model):

tests/model_fields_/test_embedded_model.py

+43
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,49 @@ def test_nested(self):
186186
self.assertCountEqual(Book.objects.filter(author__address__city="NYC"), [obj])
187187

188188

189+
class ArrayFieldTests(TestCase):
190+
@classmethod
191+
def setUpTestData(cls):
192+
cls.book = Book.objects.create(
193+
author=Author(
194+
name="Shakespeare",
195+
age=55,
196+
skills=["writing", "editing"],
197+
address=Address(city="NYC", state="NY", tags=["home", "shipping"]),
198+
),
199+
)
200+
201+
def test_contains(self):
202+
self.assertCountEqual(Book.objects.filter(author__skills__contains=["nonexistent"]), [])
203+
self.assertCountEqual(
204+
Book.objects.filter(author__skills__contains=["writing"]), [self.book]
205+
)
206+
# Nested
207+
self.assertCountEqual(
208+
Book.objects.filter(author__address__tags__contains=["nonexistent"]), []
209+
)
210+
self.assertCountEqual(
211+
Book.objects.filter(author__address__tags__contains=["home"]), [self.book]
212+
)
213+
214+
def test_contained_by(self):
215+
self.assertCountEqual(
216+
Book.objects.filter(author__skills__contained_by=["writing", "publishing"]), []
217+
)
218+
self.assertCountEqual(
219+
Book.objects.filter(author__skills__contained_by=["writing", "editing", "publishing"]),
220+
[self.book],
221+
)
222+
# Nested
223+
self.assertCountEqual(
224+
Book.objects.filter(author__address__tags__contained_by=["home", "work"]), []
225+
)
226+
self.assertCountEqual(
227+
Book.objects.filter(author__address__tags__contained_by=["home", "work", "shipping"]),
228+
[self.book],
229+
)
230+
231+
189232
class InvalidLookupTests(SimpleTestCase):
190233
def test_invalid_field(self):
191234
msg = "Author has no field named 'first_name'"

0 commit comments

Comments
 (0)