djongo icon indicating copy to clipboard operation
djongo copied to clipboard

__contains does not support parenthesis

Open LakshmiPrabhaN opened this issue 2 years ago • 3 comments

One line description of the issue __contains in filter does not support parenthesis and gives empty queryset as a result

Example, i need to get this object { "channel": '["Admin (role)"]' }

Python script

models.py

`from djongo import models import jsonfield

class word(models.Model): channel = jsonfield.JSONField()`

views.py

queryset = word.objects.filter(channel__contains="Admin (role)")

It translates the query as the following filter: { channel: { '$regex': '^.*"Admin (role)".*$' } }

But we need the translated query filter: { channel: { '$regex': '^.*"Admin \\(role\\)".*$' } }

Also tried word.objects.filter(channel__contains="Admin \\(role\\)") but it is not working

Env

Django==2.2.24 django-jsonfield==1.4.1 djangorestframework==3.11.0 djongo==1.3.6 dnspython==2.3.0 pymongo==3.12.1 pytz==2022.7.1 six==1.16.0 sqlparse==0.2.4

LakshmiPrabhaN avatar Apr 19 '23 10:04 LakshmiPrabhaN

the same thing happens to me with the "+" character

pimuzzo avatar May 16 '23 11:05 pimuzzo

Code self.to_match = re.sub(r'([]()[{}.*+^$?|\/])', r'\\\g<1>', self.to_match)

Only add one line to operators.py. image

Code self.to_match = re.escape(self.to_match) I also found a solution in #620. This is a more simple way! If you are using the older version (not master) of 1.3.6, you can modify operators.py as #620.

IntelligentSynthesis avatar Jun 02 '23 02:06 IntelligentSynthesis

OffTopic:

t translates the query as the following filter: { channel: { '$regex': '^."Admin (role)".$' } }

How can i see the translated query from ORM to mongoDB? looking for too much time now :(

Assassin9520 avatar Apr 03 '24 10:04 Assassin9520