Создание индекса Gin для хранимого генерируемого столбца Postgres в Django
Я хочу настроить Postgres "stored generated columns" с индексацией для полнотекстового поиска по двум полям модели. Я создал генерируемый столбец, воспользовавшись помощью из этого руководства , но при установке gin-индекса на столбец я получаю следующее:
django.core.exceptions.FieldDoesNotExist: Article has no field named 'vector_column'. The app cache isn't ready yet, so if this is an auto-created related field, it won't be available yet.
И моя Article
модель:
class Article(models.Model):
title = models.CharField(...)
content = models.TextField(...)
class Meta:
indexes = [GinIndex(fields=['vector_column'])]
и мой пользовательский sql в файле миграции:
operations = [
migrations.RunSQL(
sql='''
ALTER TABLE articles_article ADD COLUMN vector_column tsvector GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', coalesce(content,'')), 'B')
) STORED;
''',
reverse_sql='''
ALTER TABLE articles_article DROP COLUMN vector_column;
'''
),
]
Возможно ли установить индекс из Django? Кажется, Django требует, чтобы поле было определено в модели, но это не то, как работает сгенерированный столбец. Если нет, то каков правильный способ установки правильного индекса (упомянутого в этой Postgres doc, в конце - on) в файлах миграции?
Как сказал Iain в комментариях, индекс должен обрабатываться в миграциях. Я только что добавил еще одну миграцию к массиву operations
:
operations = [
migrations.RunSQL(
sql='''
ALTER TABLE articles_article ADD COLUMN vector_column tsvector GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', coalesce(content,'')), 'B')
) STORED;
''',
reverse_sql='''
ALTER TABLE articles_article DROP COLUMN vector_column;
'''
),
migrations.RunSQL(
sql='''
CREATE INDEX textsearch_idx ON articles_article USING GIN (vector_column);
''',
reverse_sql='''
DROP INDEX IF EXISTS textsearch_idx;
'''
),
]