djongo icon indicating copy to clipboard operation
djongo copied to clipboard

Unable to filter nested fields in JSONField using Django ORM

Open eibrahimov opened this issue 2 years ago • 3 comments

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?

eibrahimov avatar Sep 27 '23 14:09 eibrahimov

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

raykhey avatar Oct 09 '23 11:10 raykhey

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

panrobot avatar Dec 27 '23 09:12 panrobot

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

Uysim avatar Apr 30 '24 07:04 Uysim