#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         |       Keywords:
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  1              |
-----------------------------------------+------------------------
 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

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29504>
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/055.37068f1bdc02eb33cfa16e5385cf3f1e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to