У меня есть модель Django, которая содержит PostgreSQL jsonb field
:
class SocialUser(models.Model):
id = models.BigIntegerField(primary_key=True)
data = JSONField(blank=True, null=True, db_index=True)
Поле данных содержит атрибут username
.
Я проиндексировал этот атрибут
CREATE INDEX ON users_socialuser ((data->>'username'));
Когда я запрашиваю его через Django ORM с идентификатором,
SocialUser.objects.get(id=123)
и через pgAdmin
SELECT * FROM users_socialuser WHERE id = 123
они оба быстрые.
Но когда я запрашиваю имя пользователя атрибута JSONField, SQL-запрос pgAdmin
SELECT * FROM users_socialuser WHERE data->>'username' = 'abc'
по-прежнему одинаково быстро, в то время как
SocialUser.objects.get(data__username='abc')
ужасно медленно.
Похоже, что Django ORM не использует индекс атрибута username
.
Почему это так? Могу ли я явно указать индекс в Django ORM? Есть ли обходной путь для этого?