Как попасть в индекс базы данных json в запросе Django?

Я создал индекс на models.JSONField в моей базе данных postgres.

class Meta:
 indexes=[
   models.Index(KeyTextTransform('id', 'my_json_field'), name='my_json_id_idx')
 ]

я написал немного sql на pg_indexes для проверки и он там есть CREATE INDEX my_json_id_idx on my_model USING btree (((my_json_field ->> 'id'::text)))

Одна вещь, которую следует отметить, это то, что он использует ->>, что означает, что он приводится к тексту, я почти уверен.

Тогда, если я попытаюсь сделать запрос следующим образом my_query = MyModel.objects.filter(my_json_field__id=1234) Если я анализирую с помощью my_query.explain(analyze=True), то он показывает последовательное сканирование. При этом мой индекс вообще НЕ попадает в индекс. Когда я смотрю на SQL запроса, я думаю, что замечаю разницу в том, что в нем используется Filter: (my_model.my_json_field -> 'id'::text) = '1234'::jsonb. Или если я просто посмотрю на SQL запроса, то он в основном такой: select * from my_model where (my_json_field -> id) = 1234

Я думаю, что -> в запросе против --> в индексе - вот что делает расхождение.

Как правильно написать запрос, чтобы он попал в индекс, или я должен переписать индекс, чтобы он использовал ->? Кто-нибудь знает, как переписать утверждение в indexes так, чтобы оно создавало его с -> ?

P.S Я могу написать сырой sql, который попадает в этот индекс так

select * 
from my_model
where (my_json_field->>'id') = '1234'

это попадает в индекс

Вернуться на верх