La definición de mi modelo es la siguiente (un modelo simplificado del que se usa en el producto real. Hay un par de otros campos:
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']) ]Ejecuto hacer migraciones y migrar comandos. Estos funcionan correctamente.
Luego ejecuto el siguiente conjunto de comandos para construir el índice:
search_vector = SearchVector('tags__name') Product.objects.all().update(search_vector=search_vector)Termino recibiendo el siguiente error:
django.core.exceptions.FieldError: Joined field references are not permitted in this query
Esto es claramente causado por el campo tags__name , pero no estoy seguro de cómo resolverlo.
¿Puede alguien explicarme qué tendría que hacer para ejecutar los comandos anteriores correctamente?
¡Gracias!
No se puede hacer de esta manera.
Un enfoque posible es escribir activadores personalizados utilizando una migración hecha a sí misma. Los disparadores buscarían en la tag la tabla y actualizarían el índice search_vector en cada acción de estos:
product ,tag ,tag ,tag ,Product .¿Parece un verdadero desastre? Así es. Aquí puedes ver a un chico que probó este enfoque.
Yo sugeriría una forma más directa. Puede agregar product.tags_for_search TextField , que se mantendría manualmente.
DELETED , por lo que no sería necesario actualizar product.tags_for_search cuando se elimine una etiqueta.product , todo está bien, solo necesita establecer un valor de campo adecuado, lo mismo ocurre con la actualización de un conjunto de etiquetas.Su objetivo parece bastante alcanzable para mí de esta manera.