/ / Как да създадете GIN индекс в Django миграция - django, postgresql, индексиране, миграция, django-миграции

Как да създадете GIN индекс в миграцията Django - django, postgresql, индексиране, миграция, django-миграции

В Django, тъй като версия 1.11 имаме клас за PostgreSQL GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/). Бих искал да създам миграция, която изгражда такъв индекс на a VectorSearchField Добавих в една от масите си. Досега се опитах просто да добавя db_index=True към VectorSearchField, но това не е така, защото се опитва да създаде индекс B-Tree (мисля) и VectorSearchField стойностите са твърде дълги.

Успях да създам индекса, който искам, като стартирам a migrations.RunSQL() миграция с:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

Въпреки това, предполагам, тъй като има специален GinIndex клас в Джанго, може би има начин да се създаде такъв индекс, без да се изпълнява суров SQL?

Тук е модел клас:

import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
speaker = models.CharField(max_length=512, db_index=True)
text = models.TextField()
sv = pg_search.SearchVectorField(null=True)  # I want a GIN index on this field.

Всяка идея как правилно да създадете индекс за sv поле в миграция? Или изпълнява CREATE INDEX ... потърсете най-добрия начин?

Отговори:

10 за отговор № 1

Все още имах възможност да мигрирам старите си команди CREATE INDEX към новата система, въведена в 1.11, но моето разбиране е

from django.contrib.postgres.indexes import GinIndex
import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
speaker = models.CharField(max_length=512, db_index=True)
text = models.TextField()
sv = pg_search.SearchVectorField(null=True)
class Meta:
indexes = [GinIndex(fields=["sv"])]

Необходимо е. Не е необходимо вече да се използват изречения за SQL CREATE INDEX