{{{
If the key is an integer, it will be interpreted as an index lookup in an
array:
>>> Dog.objects.filter(data__owner__other_pets__0__name='Fishy')
}}}
Note the specific mention of **array**. While this might be true, it is
not the whole truth as applied to **dict/object**. For example, given a
**dict/object** whose keys are strings (as always in JSON) but which look
like integers:
{{{
"employee": {
"415": {
"email": "Sherloc...@acme.co.uk",
"mobile": "0700 1234567",
}}}
how is one supposed to select the **"415"** bit? It turns out that the
same syntax as for the array case applies:
{{{
Foo.objects.filter(snapshot__employee__415__mobile='0700 1234567')
}}}
This was not at all obvious to me at least, especially as if the **"415"**
is looked up as the terminal level in the query, the syntax becomes very
different:
{{{
Foo.objects.filter(snapshot__employee__has_key='415')
}}}
Since I wasted quite a bit of time on this, I thought it might be useful
to strengthen the documentation in this area to clarify how to lookup:
* In arrays and dict/objects
* if the key is the final term in the query
* if the key is not the final term in the query
--
Ticket URL: <https://code.djangoproject.com/ticket/29504>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
New description:
The documentation on performing queries inside JSONField values
[https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#key-
index-and-path-lookups] says:
{{{
If the key is an integer, it will be interpreted as an index lookup in an
array:
>>> Dog.objects.filter(data__owner__other_pets__0__name='Fishy')
}}}
Note the specific mention of **array**. While this might be true, it is
not the whole truth as applied to **dict/object**. For example, given a
**dict/object** whose keys are strings (as always in JSON) but which look
like integers:
{{{
"employee": {
"415": {
"email": "Sherloc...@acme.co.uk",
"mobile": "0700 1234567",
}}}
how is one supposed to select the **"415"** bit? It turns out that the
same syntax as for the array case applies:
{{{
Foo.objects.filter(snapshot__employee__415__mobile='0700 1234567')
}}}
This was not at all obvious to me at least, especially as if the **"415"**
is looked up as the final key in the query, the syntax becomes very
different:
{{{
Foo.objects.filter(snapshot__employee__has_key='415')
}}}
Since I wasted quite a bit of time on this, I thought it might be useful
to strengthen the documentation in this area to clarify how to lookup:
* In arrays and dict/objects
* if the key is the final term in the query
* if the key is not the final term in the query
--
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:1>
* ui_ux: 1 => 0
* version: 2.0 => master
* stage: Unreviewed => Accepted
Comment:
OK, I'm going to provisionally accept this. If you can put together a
patch we can have a look and see if there's a clarification to be made.
I'm **half-minded** to say `wontfix` since JSON keys must always be
strings, and whilst, like `'415'`, they might look like integers, there's
no real ambiguity.
But lets see what improvement you have in mind. :)
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:2>
* cc: Carlton Gibson (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:3>
Comment (by Shaheed Haque):
I've created a PR at [https://github.com/django/django/pull/10077]. Please
consider.
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:4>
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:5>
* status: new => closed
* type: Uncategorized => Cleanup/optimization
* resolution: => wontfix
Comment:
Closing per discussion on PR.
--
Ticket URL: <https://code.djangoproject.com/ticket/29504#comment:6>