My model definition is as follows (a simplified model of the one being used in actual product. There are a coupe of other fields:
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'])
]
I run make migrations and migrate commands. These work correctly.
I then run the following set of commands to build the index:
search_vector = SearchVector('tags__name')
Product.objects.all().update(search_vector=search_vector)
I end up getting the following error:
django.core.exceptions.FieldError: Joined field references are not permitted in this query
This is clearly caused by the tags__name
field, but I am not sure how to solve it.
Can someone please explain what I would need to do in order to run the above commands correctly?
Thanks!
It cannot be done this way.
A possible approach is to write custom triggers using self-made migration. Triggers would look into table tag
and update the index search_vector
on each action of these:
product
,tag
,tag
,tag
,Product
's tags.Looks like a real mess? So it is. Here you can see one guy tried this approach.
I'd suggest a more straightforward way. You can add product.tags_for_search
TextField
, which would be maintained manually.
DELETED
, so we wouldn't need to update product.tags_for_search
when a tag is deleted.product
everything is fine, you just need to set a proper field value, same goes for updating a set of tags.Your goal seems quite achievable for me this way.