It looks that building multi-level/recursive filters with `JSON_EXISTS()`
is the only feasible way, but it's really complicated and can be clunky.
I think we should drop this lookup on Oracle and raise
`NotSupportedError`.
Some examples:
{{{
diff --git a/tests/model_fields/test_jsonfield.py
b/tests/model_fields/test_jsonfield.py
index 3ce7fc51a9..b659675ec8 100644
--- a/tests/model_fields/test_jsonfield.py
+++ b/tests/model_fields/test_jsonfield.py
@@ -445,8 +445,12 @@ class TestQuerying(TestCase):
tests = [
({}, self.objs[2:5] + self.objs[6:8]),
({'baz': {'a': 'b', 'c': 'd'}}, [self.objs[7]]),
+ ({'baz': {'a': 'b'}}, [self.objs[7]]),
+ ({'baz': {'c': 'd'}}, [self.objs[7]]),
({'k': True, 'l': False}, [self.objs[6]]),
({'d': ['e', {'f': 'g'}]}, [self.objs[4]]),
+ ({'d': ['e']}, [self.objs[4]]),
+ ({'d': [{'f': 'g'}]}, [self.objs[4]]),
([1, [2]], [self.objs[5]]),
({'n': [None]}, [self.objs[4]]),
({'j': None}, [self.objs[4]]),
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31835>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/31835#comment:1>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/13248 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/31835#comment:2>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"02447fb133b53ec7d0ff068cc08f06fdf8817ef7" 02447fb1]:
{{{
#!CommitTicketReference repository=""
revision="02447fb133b53ec7d0ff068cc08f06fdf8817ef7"
Fixed #31835 -- Dropped support for JSONField __contains lookup on Oracle.
The current implementation works only for basic examples without
supporting nested structures and doesn't follow "the general principle
that the contained object must match the containing object as to
structure and data contents, possibly after discarding some
non-matching array elements or object key/value pairs from the
containing object".
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31835#comment:3>
Comment (by Mariusz Felisiak <felisiak.mariusz@…>):
In [changeset:"028a5f86f22d4be0746cbd38d09d6961024b2ef7" 028a5f8]:
{{{
#!CommitTicketReference repository=""
revision="028a5f86f22d4be0746cbd38d09d6961024b2ef7"
[3.1.x] Fixed #31835 -- Dropped support for JSONField __contains lookup on
Oracle.
The current implementation works only for basic examples without
supporting nested structures and doesn't follow "the general principle
that the contained object must match the containing object as to
structure and data contents, possibly after discarding some
non-matching array elements or object key/value pairs from the
containing object".
Backport of 02447fb133b53ec7d0ff068cc08f06fdf8817ef7 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31835#comment:4>