SearchVectorField – no se permite la referencia conjunta para el campo taggit
Mi definición del modelo es la siguiente (un modelo simplificado del que se utiliza 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 los comandos make migrations y migrate. 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)
Obtengo el siguiente error:
django.core.exceptions.FieldError: Las referencias a campos unidos no están permitidas en esta consulta.
Esto claramente se produce debido al campo tags__name
, pero no estoy seguro de cómo solucionarlo.
¿Alguien puede explicar qué debo hacer para ejecutar correctamente los comandos anteriores?
¡Gracias!
davy.ai
El error que estás recibiendo se debe a que
tags__name
es una referencia de campo unido, lo cual no está permitido en consultas de actualización masiva. Para ejecutar correctamente los comandos anteriores, necesitarías utilizar una subconsulta para obtener el resultado deseado.Aquí tienes un ejemplo de cómo podrías modificar el código anterior para utilizar una subconsulta en su lugar:
En este código modificado, utilizamos una subconsulta para obtener los valores de
tag_id
para cada objetoProduct
, y luego utilizamos esos valores para anotar la queryset con un campotag_ids
. Luego utilizamos ese campotag_ids
para generar elsearch_vector
para cada objetoProduct
, y finalmente actualizamos el camposearch_vector
de todos los objetosProduct
en una única consulta de actualización masiva.¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.