bsm*_*th4 2 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.
Run Code Online (Sandbox Code Playgroud)
当我查询 ArrayField 时,它返回一个列表,例如 ["a","b","c"] 而在数据库中,它显示在大括号中,例如{a,b,c} 有谁知道如何获取SearchVector 接受 ArrayField 作为普通列表吗?或者以某种方式将普通列表转换为大括号?
这是启动它的代码:
ExampleModel.objects.update(search_document=SearchVector("example_ArrayField"))
Run Code Online (Sandbox Code Playgroud)
我知道已经过去一年了,但我通过谷歌偶然发现了这个问题,并且找不到任何人可以针对这个问题提供可接受的解决方案,所以这是我正在使用的代码。
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)
Run Code Online (Sandbox Code Playgroud)
--编辑-- 发布此解决方案几个小时后,我意识到它仅在更新记录时起作用,但在插入记录时不起作用。这是一个更好的解决方案。
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)
Run Code Online (Sandbox Code Playgroud)