SearchVectorField - объединенная ссылка не разрешена для поля taggit
Мое определение модели следующее (упрощенная модель той, которая используется в реальном продукте. Есть куча других полей:
from django.db import models
from taggit.managers import TaggableManager
from django.contrib.postgres.search import SearchVectorField
from django.contrib.postgres.indexes import GinIndex
class Product(models.Model):
tags = TaggableManager()
search_vector = SearchVectorField(null=True)
class Meta:
indexes = [
GinIndex(fields=['search_vector'])
]
Я запускаю команды make migrations и migrate. Они работают правильно.
Затем я выполняю следующий набор команд для построения индекса:
search_vector = SearchVector('tags__name')
Product.objects.all().update(search_vector=search_vector)
В итоге я получаю следующую ошибку:
django.core.exceptions.FieldError: Joined field references are not permitted in this query
Это явно вызвано полем tags__name
, но я не уверен, как решить эту проблему.
Может ли кто-нибудь объяснить, что мне нужно сделать, чтобы правильно выполнить вышеуказанные команды?
Спасибо!
Это невозможно сделать таким образом.
Возможный подход - написать пользовательские триггеры, используя самодельную миграцию. Триггеры будут просматривать таблицу tag
и обновлять индекс search_vector
при каждом таком действии:
- ВСТАВИТЬ в
product
, - INSERT в
tag
, - ОБНОВИТЬ
tag
, - DELETE from
tag
, - Обновление тегов
Product
.
Похоже на настоящий беспорядок? Так оно и есть. Здесь вы можете увидеть, как один парень попробовал этот подход.
Я бы предложил более простой способ. Вы можете добавить product.tags_for_search
TextField
, которые будут поддерживаться вручную.
- Давайте откажемся от удаления тегов. Они могут быть помечены
DELETED
, так что нам не нужно будет обновлятьproduct.tags_for_search
при удалении тега. - Если нам нужно переименовать тег и сохранить все отношения, мы можем просто добавить один и скопировать все отношения.
- Для вставки записей
product
все в порядке, нужно только установить правильное значение поля, то же самое касается обновления набора тегов.
Ваша цель кажется мне вполне достижимой таким образом.