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

Unable to filter nested fields in JSONField using Django ORM #682

Open eibrahimov opened 9 months ago

eibrahimov commented 9 months ago

I am using Djongo to integrate MongoDB with my Django project. I have a model with a JSONField and I am trying to filter based on a nested field within the JSONField. Here's a simplified version of my model and the query I am attempting:

from djongo import models as mongo_models

class ProcessIDs(mongo_models.Model):
    data = mongo_models.JSONField(max_length=1000, default=dict())
    # ... other fields ...

# Example object creation
process = ProcessIDs.objects.create(
    data={'redirect_ids': {'ids': ['1234567', '7654321'], 'status': 'active'}, "category_type": "custom"}
)

# Attempted query
active_processes = ProcessIDs.objects.filter(data__redirect_ids__status__exact='active')

This query results in the following error: FieldError: Unsupported lookup ‘redirect_ids’ for JSONField or join on the field not permitted.

I am looking for a way to filter by the nested field data->redirect_ids->status using Django ORM with Djongo. Is this a known limitation, or is there a workaround to achieve this?

raykhey commented 9 months ago

Try active_processes = ProcessIDs.objects.filter(data={"redirect_ids":{"status":'active'}})

panrobot commented 6 months ago

Hi,

[EDIT] I have done this with a djongo version before Nov 13 merge. Maybe now it is fixed but still not uploaded to PIP so try with building from repo and use syntax proposed by @raykhey [/EDIT]

the problem is with LikeOp and CmpOp from operators.py - there should be a recursive dictionary crawler to build a proper Mongo query. My workaround was:

  1. clone repository
  2. fix LikeOp by adding some method to crawl dictionary and CmpOp to properly build query
  3. build a pip package using local repo (e.g. SO)
  4. use syntax proposed by @raykhey
Uysim commented 2 months ago

Did any one find the solution for this? Actually, this is the basic need for normal query.