django - 无法使用 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
解决方案
F() 表达式只能用于更新,不能用于插入。
我不是 VectorField 方面的专家,但可能weight='A'
是导致F()
表达式的原因。weight
如您所指的教程所示,它是否可以在没有 的情况下工作?
否则,请尝试更新:
Author.objects.all().update(search_vector=SearchVector('name', weight='A'))
推荐阅读
- css - 是否有任何具有特定值的属性的 CSS 选择器?
- node.js - 安装 gatsby-rehype-inline-images 包时如何解决 NPM 安装错误
- python - 为什么我不能在 python 中加载这个 json 文件?
- python - Python图像遮罩和去除背景
- algorithm - 贪心问题是没有重叠子问题的递归算法吗?
- beautifulsoup - Beautifulsoup find_all 找不到没有 data_reactid 的元素
- android - 我应该在哪里重新检查 Android 权限?
- php - 在wordpress中将段落分成2个部分
- r - 当闪亮的应用程序第一次启动时显示一个按钮,这将导致 tabItems 内容
- bash - Bash 中 RANDOM 和 SRANDOM 的区别