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 все в порядке, нужно только установить правильное значение поля, то же самое касается обновления набора тегов.

Ваша цель кажется мне вполне достижимой таким образом.

Вернуться на верх