Skip to content

Commit 2e55db8

Browse files
committed
implement contains
1 parent 6338305 commit 2e55db8

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
@@ -82,12 +82,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
8282
"auth_tests.test_views.LoginTest.test_login_session_without_hash_session_key",
8383
# GenericRelation.value_to_string() assumes integer pk.
8484
"contenttypes_tests.test_fields.GenericRelationTests.test_value_to_string",
85-
# Can contains be implemented?
86-
"model_fields_.test_arrayfield.TestQuerying.test_contains",
87-
"model_fields_.test_arrayfield.TestQuerying.test_contains_charfield",
85+
# contains with expressions/subqueries doesn't work.
8886
"model_fields_.test_arrayfield.TestQuerying.test_contains_including_expression",
8987
"model_fields_.test_arrayfield.TestQuerying.test_contains_subquery",
88+
# Add FieldGetDbPrepValueMixin to lookups?
89+
# https://github.com/django/django/commit/5a36c81f58b8ff45d8dac052343722c54e3fa521#diff-10cd50a6d8761600a1aea96d413184582481a278388b4ad38a788030a21cbd45R5
9090
"model_fields_.test_arrayfield.TestQuerying.test_enum_lookup",
91+
# Unsupported conversion from array to string in $convert
9192
"model_fields_.test_arrayfield.TestQuerying.test_icontains",
9293
# Field 'field' expected a number but got Value(1).
9394
"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,7 +4,7 @@
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
@@ -266,9 +266,30 @@ 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+
276+
return {
277+
"$gt": [
278+
{
279+
"$cond": {
280+
"if": {"$eq": [lhs_mql, None]},
281+
"then": None,
282+
"else": {"$size": {"$setIntersection": [lhs_mql, [2]]}},
283+
}
284+
},
285+
0,
286+
]
287+
}
288+
289+
269290
# @ArrayField.register_lookup
270291
# class ArrayExact(ArrayRHSMixin, Exact):
271-
# pass
292+
# pass
272293

273294

274295
@ArrayField.register_lookup

0 commit comments

Comments
 (0)