Skip to content

Commit 92cc106

Browse files
committed
INTPYTHON-599 Make a field's custom lookups available in embedded model queries
1 parent 43f477c commit 92cc106

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-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):

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

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

188+
def test_embedded_array_field_lookups(self):
189+
obj = Book.objects.create(
190+
author=Author(
191+
name="Shakespeare",
192+
age=55,
193+
skills=["writing", "editing"],
194+
address=Address(city="NYC", state="NY", tags=["home", "shipping"]),
195+
),
196+
)
197+
self.assertCountEqual(Book.objects.filter(author__skills__contains=["nonexistent"]), [])
198+
self.assertCountEqual(Book.objects.filter(author__skills__contains=["writing"]), [obj])
199+
self.assertCountEqual(
200+
Book.objects.filter(author__skills__contained_by=["writing", "editing", "publishing"]),
201+
[obj],
202+
)
203+
self.assertCountEqual(
204+
Book.objects.filter(author__address__tags__contains=["nonexistent"]), []
205+
)
206+
self.assertCountEqual(Book.objects.filter(author__address__tags__contains=["home"]), [obj])
207+
self.assertCountEqual(
208+
Book.objects.filter(author__address__tags__overlap=["shipping", "work"]), [obj]
209+
)
210+
188211

189212
class InvalidLookupTests(SimpleTestCase):
190213
def test_invalid_field(self):

0 commit comments

Comments
 (0)