doableware / djongo

Django and MongoDB database connector
https://www.djongomapper.com
GNU Affero General Public License v3.0
1.86k stars 351 forks source link

__contains does not support parenthesis #665

Open LakshmiPrabhaN opened 1 year ago

LakshmiPrabhaN commented 1 year ago

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

pimuzzo commented 1 year ago

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

IntelligentSynthesis commented 1 year ago

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.

Assassin9520 commented 3 months ago

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 :(