Skip to content

Commit 47e4940

Browse files
committed
implement contains
1 parent 9e29490 commit 47e4940

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

django_mongodb/features.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
8080
"auth_tests.test_views.LoginTest.test_login_session_without_hash_session_key",
8181
# GenericRelation.value_to_string() assumes integer pk.
8282
"contenttypes_tests.test_fields.GenericRelationTests.test_value_to_string",
83-
# Can contains be implemented?
84-
"model_fields_.test_arrayfield.TestQuerying.test_contains",
85-
"model_fields_.test_arrayfield.TestQuerying.test_contains_charfield",
83+
# contains with expressions/subqueries doesn't work.
8684
"model_fields_.test_arrayfield.TestQuerying.test_contains_including_expression",
8785
"model_fields_.test_arrayfield.TestQuerying.test_contains_subquery",
86+
# Add FieldGetDbPrepValueMixin to lookups?
87+
# https://github.com/django/django/commit/5a36c81f58b8ff45d8dac052343722c54e3fa521#diff-10cd50a6d8761600a1aea96d413184582481a278388b4ad38a788030a21cbd45R5
8888
"model_fields_.test_arrayfield.TestQuerying.test_enum_lookup",
89+
# Unsupported conversion from array to string in $convert
8990
"model_fields_.test_arrayfield.TestQuerying.test_icontains",
9091
# Field 'field' expected a number but got Value(1).
9192
"model_fields_.test_arrayfield.TestQuerying.test_exact_with_expression",

django_mongodb/fields/__init__.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@
44
from .json import register_json_field
55
from .objectid import ObjectIdField
66

7-
__all__ = [
8-
"register_fields",
9-
"ArrayField",
10-
"ObjectIdAutoField",
11-
"ObjectIdField"
12-
]
7+
__all__ = ["register_fields", "ArrayField", "ObjectIdAutoField", "ObjectIdField"]
138

149

1510
def register_fields():

django_mongodb/fields/array.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
from django.core import checks, exceptions
55
from django.db.models import DecimalField, Field, Func, IntegerField, Transform, Value
66
from django.db.models.fields.mixins import CheckFieldDefaultMixin
7-
from django.db.models.lookups import In
7+
from django.db.models.lookups import In, Lookup
88
from django.utils.translation import gettext_lazy as _
99

1010
from django_mongodb.forms import SimpleArrayField
1111

12-
from ..query_utils import process_lhs
12+
from ..query_utils import process_lhs, process_rhs
1313
from ..utils import prefix_validation_error
1414

1515
__all__ = ["ArrayField"]
@@ -266,6 +266,27 @@ def _rhs_not_none_values(self, rhs):
266266
yield True
267267

268268

269+
@ArrayField.register_lookup
270+
class ArrayContains(Lookup): # ArrayRHSMixin, lookups.DataContains):
271+
lookup_name = "contains"
272+
273+
def as_mql(self, compiler, connection):
274+
lhs_mql = process_lhs(self, compiler, connection)
275+
value = process_rhs(self, compiler, connection)
276+
return {
277+
"$gt": [
278+
{
279+
"$cond": {
280+
"if": {"$eq": [lhs_mql, None]},
281+
"then": None,
282+
"else": {"$size": {"$setIntersection": [lhs_mql, value]}},
283+
}
284+
},
285+
0,
286+
]
287+
}
288+
289+
269290
# @ArrayField.register_lookup
270291
# class ArrayExact(ArrayRHSMixin, Exact):
271292
# pass

0 commit comments

Comments
 (0)