django - 在 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
字段以使我的读取操作更快地处理复杂的查询吗?如果是这样,那我该怎么做?我链接的文档页面没有示例。
解决方案
对于那些想要索引特定键的人,请创建原始 sql 迁移:
运行您要为其更改索引的模型的应用程序在
./manage.py makemigrations --empty yourApp
哪里。yourApp
编辑迁移即
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>';
看看你的索引是否在那里。
推荐阅读
- javascript - 多个复选框动作
- asp.net-mvc - 从控制器中的模型访问数据?
- c# - 实体框架数据类
- python-3.x - 如何检查文件是否已关闭?蟒蛇3
- android - 几个位置后的自定义gridview显示不正确的数据
- c# - 如何以 Html 形式绑定 Ajax 数据
- javascript - Error importing component from forked npm package
- ruby-on-rails - Rails webpacker in model
- x11 - How to get mode name using XCB?
- c++ - Problems with c++ quadtree