是否可以将自己的字符串添加到Django SearchVectorField?

Dax*_*Dax 4 django postgresql full-text-search

我知道如何使用原始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
Run Code Online (Sandbox Code Playgroud)

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

我尝试将'alive'变为@property方法,但看起来它只需要一个db字段进行搜索.

有没有办法在纯Django ORM中执行此操作,还是应该使用原始SQL路由?

Pao*_*rre 6

您可以使用Value()表达式SearchVector中添加字符串,如下例所示:

from django.db.models import Value

    ...
    vector = vector + SearchVector(Value('alive'))
    ...
Run Code Online (Sandbox Code Playgroud)

  • 在 Django 3 上,我必须指定output_type:`Value('alive', output_field=models.CharField())` (2认同)
  • 以此为起点,在模型 save() 方法中保持 SearchVectorField 更新。问题是使用模型本身的外键值(在本例中,fk 是“category”),因为“SearchVector('category__name')”在 Postgres 上给出了错误。这种方法有效:`SearchVector('title') + SearchVector(Value(self.category.name, output_field=models.CharField()))` (2认同)