首页 > 解决方案 > 在 Django PostgreSQL 中索引 JSONField

问题描述

我正在使用一个带有属性的简单模型,该属性将该对象的所有数据存储在 JSONField 中。将其视为将 NoSQL 数据传输到我的 PostgreSQL 数据库的一种方式。有点像这样:

from django.contrib.postgres.fields import JSONField   

class Document(models.Model):
    content = JSONField()

每个Document对象在其字段中(或多或少)具有相同的键content,因此我使用这些键查询和排序这些文档。对于查询和排序,我使用的是 Django 的annotate()函数。我最近遇到了这个:

https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/indexes/

我也知道 PostgreSQL 使用 JSONB,这显然是可索引的。所以我的问题是:我可以以某种方式索引我的content字段以使我的读取操作更快地处理复杂的查询吗?如果是这样,那我该怎么做?我链接的文档页面没有示例。

标签: djangopostgresql

解决方案


对于那些想要索引特定键的人,请创建原始 sql 迁移:

  1. 运行您要为其更改索引的模型的应用程序在./manage.py makemigrations --empty yourApp哪里。yourApp

  2. 编辑迁移即

operations = [
    migrations.RunSQL("CREATE INDEX idx_name ON your_table((json_field->'json_key'));")
]

idx_name索引的名称在哪里,your_table是你的表,json_field是你的 JSONField,json_key在这种情况下是你想要索引的键。

注意->索引创建代码行中的操作符,而不是这里->>提到的。

应该这样做,但要验证一切顺利,请运行以下 sql:

SELECT
    indexname,
    indexdef
FROM
    pg_indexes
WHERE
    tablename = '<your-table>';

看看你的索引是否在那里。


推荐阅读