#29504: JSONField dictionary/object lookup using an "integer" key
-------------------------------+--------------------------------------
     Reporter:  Shaheed Haque  |                    Owner:  nobody
         Type:  Uncategorized  |                   Status:  new
    Component:  Documentation  |                  Version:  2.0
     Severity:  Normal         |               Resolution:
     Keywords:                 |             Triage Stage:  Unreviewed
    Has patch:  0              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  0              |                    UI/UX:  1
-------------------------------+--------------------------------------
Description changed by Shaheed Haque:

Old 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": "[email protected]",
>       "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

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": "[email protected]",
       "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>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/070.a32b4d2a50f0e1182d6358c071f1ccdc%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to