django - 未分配 Django SearchRank 注释,生产中有错误,但开发中没有
问题描述
我的 Django 应用程序(带有 Postgres 后端的 Apache/WSGI)在生产中遇到错误,我无法在 dev 中重现该错误,也无法在生产机器上使用 Django shell。我该如何调试呢?
该应用程序有一个 Story 模型
class Story(models.Model):
title = models.CharField(max_length=400)
content = models.TextField(blank=True)
quality = models.FloatField(default=0)
search = SearchVectorField(null=True)
带有要search
在保存时填充的信号:
@receiver(post_save, sender=Story)
def update_search_vector(sender, instance, **kwargs):
Story.objects.filter(pk=instance.pk).update(search=SearchVector('title', 'content'))
当用户搜索时,我想返回相关且高质量的结果。我将分数指定为这两个值的调和平均值:
query = SearchQuery(form.cleaned_data['query'])
stories = stories.annotate(
rank=SearchRank(F('search'), query),
score=F('rank') * F('quality') / (F('rank') + F('quality'))
).filter(rank__gte=SEARCH_RANK_CUTOFF).order_by('-score')
这在开发人员和生产环境中的 Django shell 上运行良好。但是当通过正在运行的应用程序执行时,会引发以下错误:django.core.exceptions.FieldError: Cannot resolve keyword 'rank' into field.
我无法弄清楚如何调试它。会不会是某种错误的查询集缓存?
这是完整的错误回溯:
ERROR 2019-05-21 11:59:03,388 Internal Server Error: /stories
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/myapp/myapp/views.py", line 75, in browse
score=F('rank') * F('quality') / (F('rank') + F('quality'))
File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 1056, in annotate
clone.query.add_annotation(annotation, alias, is_summary=False)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1000, in add_annotation
summarize=is_summary)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/expressions.py", line 446, in resolve_expression
c.lhs = c.lhs.resolve_expression(query, allow_joins, reuse, summarize, for_save)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/expressions.py", line 446, in resolve_expression
c.lhs = c.lhs.resolve_expression(query, allow_joins, reuse, summarize, for_save)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/expressions.py", line 511, in resolve_expression
return query.resolve_ref(self.name, allow_joins, reuse, summarize, simple_col)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1601, in resolve_ref
join_info = self.setup_joins(field_list, self.get_meta(), self.get_initial_alias(), can_reuse=reuse)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1504, in setup_joins
names[:pivot], opts, allow_many, fail_on_missing=True,
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1420, in names_to_path
"Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'rank' into field. Choices are: content, id, quality, search, title
我安装了相同的依赖版本(通过requirements.txt
),但我注意到生产运行 python3.5.2 而开发运行 3.7.3。(并且可能libapache2-mod-wsgi-py3
调用另一个版本?)这似乎是一个可以探索的地方,但我不明白如果rank
没有另一个例外,注释添加会如何失败。
解决方案
推荐阅读
- azure - 如何以编程方式生成/获取指向 Azure 门户的资源链接?
- python - python - 从列表中构造嵌套字典
- excel - 如何在工作簿(但不是 ActiveWorkbook)中获取选定的选项卡?
- angular - Angular 2+ textarea 占位符条件和翻译
- java - JComboBox 将与泛型类型数组列表一起使用吗?
- c# - 代理服务器 vs 主机文件 vs 防火墙,哪个以编程方式阻止 C# 中的网站?
- ios - UITableViewCell 只有在某个区域被按下时才会被选中
- pentaho - PDI 中“生成行”步骤中的变量
- angular - 角,量角器,黄瓜问题
- mysql - 在我的 sql 中加入两个表不返回结果集