Opened 19 months ago
Last modified 19 months ago
#34548 closed Bug
Queryset JsonField filtering doesn't work as expected — at Version 1
Reported by: | Michael | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 4.2 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hello. I use Django 4.2, psycopg2 2.9.6 and postgis/postgis:15-3.3-alpine as database in my project.
Previously json field filtering worked as expected
extra_data__hello="world"
returned me queryset where objects extra_data json field contained {"hello": "world"}. Now I noticed queryset is empty. After some manipulations with query it start work after adding "iexact".
I expected if json field is {"hello": "world"},
objects.filter(extra_data__hello="world")
or
objects.filter(extra_data__hello=some_variable)
should return this object in query set, but it doesn't work. objects.filter(extra_datahelloiexact="world") fix this problem.
Here are queries example:
>>> token='world' >>> str(UserSocialAuth.objects.filter(extra_data__hello__exact=token).query) 'SELECT "social_auth_usersocialauth"."id", "social_auth_usersocialauth"."user_id", "social_auth_usersocialauth"."provider", "social_auth_usersocialauth"."uid", "social_auth_usersocialauth"."extra_data", "social_auth_usersocialauth"."created", "social_auth_usersocialauth"."modified" FROM "social_auth_usersocialauth" WHERE ("social_auth_usersocialauth"."extra_data" -> hello) = \'"\\"world\\""\'' >>> str(UserSocialAuth.objects.filter(extra_data__hello__iexact=token).query) 'SELECT "social_auth_usersocialauth"."id", "social_auth_usersocialauth"."user_id", "social_auth_usersocialauth"."provider", "social_auth_usersocialauth"."uid", "social_auth_usersocialauth"."extra_data", "social_auth_usersocialauth"."created", "social_auth_usersocialauth"."modified" FROM "social_auth_usersocialauth" WHERE UPPER(("social_auth_usersocialauth"."extra_data" ->> hello)::text) = UPPER(world)'
Could you give me advice how to fix this issue?
Thank you
code fixes