【问题标题】:How to add an ArrayField to a SearchVector in Django?如何在 Django 中将 ArrayField 添加到 SearchVector?
【发布时间】:2018-04-24 20:31:07
【问题描述】:

我正在尝试在 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"))

【问题讨论】:

    标签: python arrays django postgresql search


    【解决方案1】:

    我知道已经一年了,但我通过 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)
    

    【讨论】:

    • 我不确定我最终对这段特定的代码做了什么,但如果你设法解决了它,那就太好了,感谢更新。
    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2023-04-09
    • 2018-09-26
    • 2014-01-29
    • 2023-03-16
    相关资源
    最近更新 更多