我有一个 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'));
当我通过带有 id 的 Django ORM 查询它时,
SocialUser.objects.get(id=123)
并通过 pgAdmin
SELECT * FROM users_socialuser WHERE id = 123
他们都很快。
但是当我使用 JSONField 的属性用户名查询时,pgAdmin SQL 查询
SELECT * FROM users_socialuser WHERE data->>'username' = 'abc'
仍然同样快,而
SocialUser.objects.get(data__username='abc')
非常慢。
似乎 Django ORM 没有使用username
属性上的索引。
为什么呢?我可以在 Django ORM 中明确强制索引吗?有解决方法吗?