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_searchTextField,手动维护

  • 拒绝删除标签。它们可以被标记为 DELETED,因此当标签被删除时我们不需要更新 product.tags_for_search
  • 如果我们需要重命名标签并保留所有关系,我们只需添加一个并复制所有关系即可。
  • 对于插入条目 product 一切都很好,你只需要设置一个适当的字段值,更新一组标签也是如此。

你的目标对我来说似乎可以通过这种方式实现。