【问题标题】:Django PostgreSQL db_index on JSONField to query by exact keyJSONField 上的 Django PostgreSQL db_index 通过精确键查询
【发布时间】:2016-10-28 06:02:19
【问题描述】:

我有一个 Place 模型:

class Place(models.Model):

    ... some not interesting fields

    distances = models.JSONField()

在 JSONField(距离)中存储类似:

{
    '1': 10
    '2': 20
    '3': 30
    '4': 40
    ...
    '1000': 10000
}

其中键是某个位置模型的“id”,值是从这个地方到这个位置的“路上时间”

如果网站用户选择位置,我会按从最近到更远的顺序显示位置:

places = Place.objects.all().order_by(
    RawSQL('distances->%s', (str(selected_location_id),))
)

一切都很酷,除了性能。

但是,PostgreSQL 支持 JSONB 字段的索引(使用 Django 的 JSONField):

GINbtree散列

  1. 它们之间有什么区别?哪个适合我的例子?
  2. django 是否支持 JSONField 上的 db_index?如果是,如何指定使用哪个索引?

非常感谢您的帮助!

【问题讨论】:

标签: django postgresql indexing jsonb


【解决方案1】:

要索引 json 中的特定键,请创建原始 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 在这种情况下是您要索引的键。

不确定在 django 中是否有这种东西的本地包装器,我看了但找不到,但这应该可以。您可能需要注意,该索引也是通过模型元数据中的迁移创建的。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2018-10-02
    • 2020-10-08
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多