Skip to content

Commit 3b4ea28

Browse files
authored
Merge pull request #3 from cloudblue/bugfix/LITE-24359
LITE-24359 Fixed filtering for `not` RQL operator
2 parents 758d14a + 0becce5 commit 3b4ea28

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

dj_mongoengine_rql/filter_cls.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@
44

55
from dj_rql.filter_cls import RQLFilterClass
66
from django_mongoengine.fields.djangoflavor import DjangoField
7-
from mongoengine import Q
87
from py_rql.constants import FilterLookups
98

109
from dj_mongoengine_rql.constants import MongoengineFilterTypes
11-
12-
13-
class _Q(Q):
14-
def __invert__(self):
15-
return self.__class__(__raw__={'$nor': [self.query]})
10+
from dj_mongoengine_rql.q import Q
1611

1712

1813
class MongoengineRQLFilterClass(RQLFilterClass):
19-
Q_CLS = _Q
14+
Q_CLS = Q
2015
FILTER_TYPES_CLS = MongoengineFilterTypes
2116

17+
def __init__(self, *args, **kwargs):
18+
super().__init__(*args, **kwargs)
19+
self.__class__.Q_CLS.MODEL = self.__class__.MODEL
20+
2221
@classmethod
2322
def _is_valid_model_cls(cls, model):
2423
return True

dj_mongoengine_rql/q.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#
2+
# Copyright © 2022 CloudBlue LLC. All rights reserved.
3+
#
4+
5+
from mongoengine import Q as ME_Q
6+
from mongoengine.queryset.transform import query
7+
8+
9+
class Q(ME_Q):
10+
MODEL = None
11+
12+
def __invert__(self):
13+
result = self.__class__(__raw__={'$nor': [query(_doc_cls=self.MODEL, **self.query)]})
14+
15+
return result

tests/test_filter_cls.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class Doc(Document):
2020
d = fields.DateField(blank=True)
2121
dec = fields.DecimalField(blank=True)
2222
flt = fields.FloatField(blank=True)
23-
int_f = fields.IntField(blank=True)
23+
int_f = fields.IntField(blank=True, db_field='other_int_f')
2424

2525
related_doc = fields.EmbeddedDocumentField('EmbDoc', blank=True)
2626

@@ -70,3 +70,9 @@ def test_init():
7070
)
7171

7272
assert list(qs.all()) == []
73+
74+
75+
def test_not():
76+
_, qs = DocFilterClass(Doc.objects.filter(int_f=1)).apply_filters('not(eq(int_f,120))')
77+
78+
assert qs.query.q == {'$nor': [{'other_int_f': 120}], 'other_int_f': 1}

0 commit comments

Comments
 (0)