Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中将ArrayField添加到SearchVector?_Python_Arrays_Django_Postgresql_Search - Fatal编程技术网

Python 如何在Django中将ArrayField添加到SearchVector?

Python 如何在Django中将ArrayField添加到SearchVector?,python,arrays,django,postgresql,search,Python,Arrays,Django,Postgresql,Search,我试图在SearchVector中使用ArrayField,但它正在返回 django.db.utils.DataError: malformed array literal: "" LINE 1: ... = to_tsvector(COALESCE("example_model"."example_arrayfield", '')) ^ DETAIL:

我试图在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”],而在数据库中,它显示在花括号中,例如{a、b、c} 有人知道如何让SearchVector接受ArrayField作为普通列表吗?或者以某种方式将普通列表转换为花括号

以下是启动此操作的代码:

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

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

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)

我不确定我最终用这段代码做了什么,但如果你已经设法解决了它,那就太好了,谢谢你的更新。