【问题标题】:SearchVectorField - joined reference not allowed for taggit fieldSearchVectorField - taggit 字段不允许加入引用
【发布时间】:2022-01-21 17:55:57
【问题描述】:

我的模型定义如下(实际产品中使用的模型的简化模型。还有其他领域的轿跑车:

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'])
        ]

我运行 make migrations 和 migrate 命令。这些工作正常。

然后我运行以下命令集来构建索引:

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 字段引起的,但我不知道如何解决。

有人可以解释一下我需要做什么才能正确运行上述命令吗?

谢谢!

【问题讨论】:

    标签: python django postgresql django-taggit


    【解决方案1】:

    不能这样。

    一种可能的方法是使用自制迁移编写自定义触发器。触发器会查看表 tag 并在每个操作上更新索引 search_vector

    • 插入product
    • 插入tag
    • 更新tag
    • tag删除,
    • 更新Product的标签。

    看起来一团糟?就是这样。 Here 你可以看到有人尝试过这种方法。

    我会建议一种更直接的方法。可以添加product.tags_for_searchTextField,手动维护。

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

    通过这种方式,你的目标对我来说似乎很容易实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多