SearchVectorField - taggit 字段不允许加入引用
SearchVectorField - joined reference not allowed for taggit field
我的车型定义如下(实际产品中使用的简化车型,还有其他领域的coupe:
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'])
]
我运行 进行迁移和迁移命令。这些工作正常。
我然后运行下面的一组命令来建立索引:
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
字段引起的,但是我不知道怎么解决。
有人可以解释一下我需要做什么才能正确 运行 上面的命令吗?
谢谢!
这样不行。
一种可能的方法是使用自制迁移编写自定义触发器。触发器将查看 table tag
并在每个操作中更新索引 search_vector
:
- 插入
product
,
- 插入
tag
、
- 更新
tag
,
- 从
tag
、 中删除
- 正在更新
Product
的标签。
看起来一团糟?就是这样。 Here 你可以看到有人尝试过这种方法。
我建议使用更直接的方法。可以添加product.tags_for_search
TextField
,手动维护
- 拒绝删除标签。它们可以被标记为
DELETED
,因此当标签被删除时我们不需要更新 product.tags_for_search
。
- 如果我们需要重命名标签并保留所有关系,我们只需添加一个并复制所有关系即可。
- 对于插入条目
product
一切都很好,你只需要设置一个适当的字段值,更新一组标签也是如此。
你的目标对我来说似乎可以通过这种方式实现。
我的车型定义如下(实际产品中使用的简化车型,还有其他领域的coupe:
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'])
]
我运行 进行迁移和迁移命令。这些工作正常。
我然后运行下面的一组命令来建立索引:
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
字段引起的,但是我不知道怎么解决。
有人可以解释一下我需要做什么才能正确 运行 上面的命令吗?
谢谢!
这样不行。
一种可能的方法是使用自制迁移编写自定义触发器。触发器将查看 table tag
并在每个操作中更新索引 search_vector
:
- 插入
product
, - 插入
tag
、 - 更新
tag
, - 从
tag
、 中删除
- 正在更新
Product
的标签。
看起来一团糟?就是这样。 Here 你可以看到有人尝试过这种方法。
我建议使用更直接的方法。可以添加product.tags_for_search
TextField
,手动维护
- 拒绝删除标签。它们可以被标记为
DELETED
,因此当标签被删除时我们不需要更新product.tags_for_search
。 - 如果我们需要重命名标签并保留所有关系,我们只需添加一个并复制所有关系即可。
- 对于插入条目
product
一切都很好,你只需要设置一个适当的字段值,更新一组标签也是如此。
你的目标对我来说似乎可以通过这种方式实现。