首页 > 解决方案 > 无法使用 PostgreSQL 在 Django 全文搜索中保存新对象

问题描述

我正在关注这篇关于如何将全文功能添加到我的 Django 应用程序的帖子。我有以下模型:

class CustomUser(AbstractUser):
    email = models.EmailField(_('email address'), unique=True)

class Author(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete = models.CASCADE)
    name = models.CharField(max_length = 250)
    alternative_names = ArrayField(models.CharField(max_length = 250),blank=True,null=True)
    name_norm = models.CharField(max_length = 250,blank=True,null = True)
    slug = models.CharField(max_length = 250,unique = True)
    photo = models.ImageField(upload_to = 'imgs/users/%Y/%m/%d',blank = True)

    search_vector = SearchVectorField(null=True)
    def save(self, *args, **kwargs):
        self.search_vector = (SearchVector('name', weight='A') )
        super().save(*args, **kwargs)`enter code here`

当我尝试使用 save 保存新作者时:

    autor = Author(user = utilizador,name = author_name,alternative_names = alternative_names,name_norm = name_norm,slug = slug)
    autor.save()

我得到错误:

Traceback (most recent call last):
  File "populate_v2.py", line 140, in <module>
    autor.save()
  File "/home/mwon/NewArquivoOpiniao/webapp/colunadeopiniao/accounts/models.py", line 57, in save
    super().save(*args, **kwargs)
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/base.py", line 748, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/base.py", line 785, in save_base
    updated = self._save_table(
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/base.py", line 890, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/base.py", line 927, in _do_insert
    return manager._insert(
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/query.py", line 1204, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1393, in execute_sql
    for sql, params in self.as_sql():
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1336, in as_sql
    value_rows = [
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1337, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1337, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/mwon/NewArquivoOpiniao/env3.8/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1263, in prepare_value
    raise ValueError(
ValueError: Failed to insert expression "SearchVector(Col(accounts_author, accounts.Author.name), weight=A)" on accounts.Author.search_vector. F() expressions can only be used to update, not to insert.

Django 版本:3.0.11

标签: djangopostgresqldjango-models

解决方案


F() 表达式只能用于更新,不能用于插入。

我不是 VectorField 方面的专家,但可能weight='A'是导致F()表达式的原因。weight如您所指的教程所示,它是否可以在没有 的情况下工作?

否则,请尝试更新:

Author.objects.all().update(search_vector=SearchVector('name', weight='A'))

推荐阅读