Django PostgreSQL db_index на JSONField для запроса по точному ключу

У меня есть модель 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):

GIN, btree и хэш

  1. Какие различия между ними? Что подходит для моего примера?
  2. Поддерживает ли django db_index в JSONField? Если да, то как указать, какой индекс использовать?

Большое спасибо за помощь!


person MaxCore    schedule 25.06.2016    source источник
comment
Возможный дубликат Как определить, какой тип индекса использовать в Postgres?   -  person e4c5    schedule 26.06.2016
comment
На большую часть вашего вопроса отвечает связанный вопрос. Остальное звучит как ситуация, когда вам не следует использовать jsonb.   -  person e4c5    schedule 26.06.2016


Ответы (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 есть родная оболочка для такого рода вещей, я искал и не мог найти, но это должно сделать это. Возможно, вы также захотите добавить примечание о том, что этот индекс создается с помощью этой миграции, в метаданных вашей модели. Ваше здоровье!

person radtek    schedule 22.09.2020