JangField上的Django PostgreSQL db_index按精确键查询

时间:2016-06-25 22:04:52

标签: django postgresql indexing jsonb

我有一个Place模型:

class Place(models.Model):

    ... some not interesting fields

    distances = models.JSONField()

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

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

其中key是' id'一些位置模型,以及价值 - 在道路上的时间'从这个地方到这个位置

如果网站用户选择了位置,我会按照从最近到更远的位置显示地点到所选位置:

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

除了表现外,一切都很酷。

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

GIN btree 哈希

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

1 个答案:

答案 0 :(得分: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中是否有用于此类内容的本地包装程序,我看了也找不到,但是应该这样做。您可能需要说明一下,该索引也是通过此迁移在模型元中创建的。干杯!