【问题标题】:Is it possible to add your own strings to a Django SearchVectorField?是否可以将您自己的字符串添加到 Django SearchVectorField?
【发布时间】:2017-07-29 12:24:57
【问题描述】:

我知道如何使用原始 PostgreSQL 命令执行此操作,但想知道是否可以使用 Django PostgreSQL 搜索来执行此操作。

class Person(models.Model):
    name = models.CharField(max_length=64)
    description = models.CharField(max_length=256)
    active = models.BooleanField(default=False)
    search_vector = SearchVectorField(blank=True)

def update_search(person):
    vector = SearchVector('name') + SearchVector('description')
    if person.active:
        vector = vector + SearchVector('alive')
    person.search_vector = vector

django.core.exceptions.FieldError: 无法将关键字“alive”解析为字段。

我尝试将'alive' 设为@property 方法,但看起来它只需要一个用于搜索的数据库字段。

有没有办法在纯 Django ORM 中做到这一点,或者我应该走原始 SQL 路线?

【问题讨论】:

    标签: django postgresql full-text-search


    【解决方案1】:

    您可以使用Value() expressions 在您的SearchVector 中添加一个字符串,如下例所示:

    from django.db.models import Value
    
        ...
        vector = vector + SearchVector(Value('alive'))
        ...
    

    【讨论】:

    • 哦哦。很好的发现。会试试这个。
    • 在 Django 3 上,我必须指定 output_type:Value('alive', output_field=models.CharField())
    • 以此为起点在模型 save() 方法中保持 SearchVectorField 更新。问题是使用模型本身的外键中的值(在这个例子中,fk 是category),因为SearchVector('category__name') 在 Postgres 上给出了错误。这种方法有效:SearchVector('title') + SearchVector(Value(self.category.name, output_field=models.CharField()))
    【解决方案2】:

    SearchVector 不应该这样使用。它应该只接受字段名称。

    请看here

    【讨论】:

    • 其实SearchVectori接受的不是字段名。您可以在SearchVector 中使用表达式,正如我在answer 中所写的那样。
    猜你喜欢
    • 2017-07-14
    • 2017-09-01
    • 2021-05-17
    • 2011-12-29
    • 2018-02-02
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多