python - 如何将 ArrayField 添加到 Django 中的 SearchVector?

标签 python arrays django postgresql search

我正在尝试在 SearchVector 中使用 ArrayField,但它正在返回

django.db.utils.DataError: malformed array literal: ""
LINE 1: ... = to_tsvector(COALESCE("example_model"."example_arrayfield", ''))
                                                                      ^
DETAIL:  Array value must start with "{" or dimension information.

当我查询 ArrayField 时,它返回一个列表,例如["a","b","c"] 而在数据库中,它显示在 curley 括号中,例如 {a,b,c} 有谁知道如何让 SearchVector 接受 ArrayField 作为普通列表?或者以某种方式将普通列表转换为 curley 括号?

这是启动它的代码:

ExampleModel.objects.update(search_document=SearchVector("example_ArrayField"))

最佳答案

我知道已经一年了,但我通过 Google 偶然发现了这个问题,找不到任何人为这个确切问题提供可接受的解决方案,所以这是我正在使用的代码。

from django.db.models import F, Func, Value
from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.search import SearchVector, SearchVectorField


class SearchableStuff(models.Model):
    name = models.CharField(
        _('Name'),
        max_length=256,
        null=False, blank=False)
    tags = ArrayField(
        models.CharField(max_length=50, blank=True),
        verbose_name=_('Tags'),
        default=list,
        size=16,
        blank=True)
    search_vector = SearchVectorField(
        _('Search vector'),
        null=True)

    def save(self, *args, **kwargs):
        self.search_vector = \
            SearchVector('name', weight='A', config='french') + \
            SearchVector(
                Func(F('tags'), Value(' '), function='array_to_string'),
                weight='A',
                config='french')
        return super().save(*args, **kwargs)

--编辑-- 发布这个解决方案几个小时后,我意识到它只在更新记录时有效,而不是插入记录。这是一个更好的解决方案。

def save(self, *args, **kwargs):
    # Note: we use `SearchVector(Value(self.field))` instead of
    # `SearchVector('field')` because the latter only works for updates,
    # not when inserting new records.
    self.search_vector = \
        SearchVector(Value(self.name), weight='A', config='french') + \
        SearchVector(
            Value(' '.join(self.tags)),
            weight='A',
            config='french')
    return super().save(*args, **kwargs)

关于python - 如何将 ArrayField 添加到 Django 中的 SearchVector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242639/

相关文章:

python - 在没有输入的情况下将Python3输入设置为默认数字

python - 使用 Python 使用字典值对语料库中的单词进行计数的函数

python - 如何更改 Treeview 的背景颜色

python - 如何使用TideSDK openFolderChooseDialog

javascript - 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

Java 替换文本文件中的字符 - 爱丽丝梦游仙境

java - 多线程数组内容?

django - 如何修改Browsable API表单

django - 什么是 Django 查询集?

django-rest-framework:设置外键序列化器