Python &引用;“用户匹配查询不存在”;发生在模板中,但不在单元测试中?
在Django项目中,有一个定义类似于以下内容的Python &引用;“用户匹配查询不存在”;发生在模板中,但不在单元测试中?,python,sql,django,database,Python,Sql,Django,Database,在Django项目中,有一个定义类似于以下内容的系列模型: class Family(BaseFamily): employee_first_name = models.CharField(max_length=255, blank=True) employee_last_name = models.CharField(max_length=255, blank=True) partner_first_name = models.CharField(max_length=
系列
模型:
class Family(BaseFamily):
employee_first_name = models.CharField(max_length=255, blank=True)
employee_last_name = models.CharField(max_length=255, blank=True)
partner_first_name = models.CharField(max_length=255, blank=True)
partner_last_name = models.CharField(max_length=255, blank=True)
其中BaseFamily
有一个包
和lucy\u指南
外键:
class BaseFamily(TimeStampedModel):
package = models.ForeignKey('lucy_web.Package',
models.SET_NULL,
blank=True,
null=True)
lucy_guide = models.ForeignKey(
User,
blank=True,
null=True,
related_name='lucy_guide_%(class)s',
limit_choices_to={'is_staff': True})
包
模型依次链接到一家公司
:
class Package(TimeStampedModel):
company = models.ForeignKey('lucy_web.Company')
而公司
则有一个lucy\u指南
和一个default\u包
:
class Company(TimeStampedModel):
lucy_guide = models.ForeignKey(
User,
blank=True,
null=True,
related_name='lucy_guide_%(class)s',
limit_choices_to={'is_staff': True})
default_package = models.OneToOneField(
Package,
blank=True,
null=True,
related_name='default_for_%(class)s')
现在,我有一个使用以下模板标记的模板,edit\u view\u family\u heading
:
from django import template
register = template.Library()
@register.simple_tag
def edit_view_family_heading(family):
heading = [family.employee_first_name]
if family.employee_last_name != family.partner_last_name:
heading.append(family.employee_last_name)
heading.extend([
'&',
family.partner_first_name,
family.partner_last_name
])
heading = [e for e in heading if e]
if heading[0] == '&':
heading.pop(0)
if heading and heading[-1] == '&':
heading.pop()
if heading:
if family.lucy_guide:
heading.append(f'({family.lucy_guide.first_name})')
return ' '.join(heading)
else:
return family.id
但是,如果尝试显示模板,则会出现以下错误:
Template error:
In template /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/dashboard/templates/dashboard.html, error at line 0
User matching query does not exist. 1 : {% load static %}
2 : {% load sass_tags %}
3 : {% load compress %}
4 : {% load google_analytics %}
5 : {% load active_page %}
6 :
7 : <!DOCTYPE html>
8 : <html lang="en">
9 : <head>
10 : <title>Cleo Admin | {% block page_title %}{% endblock %}</title>
Traceback:
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __get__
178. rel_obj = getattr(instance, self.cache_name)
During handling of the above exception ('Family' object has no attribute '_lucy_guide_cache'), another exception occurred:
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
217. response = self.process_exception_by_middleware(e, request)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
215. response = response.render()
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/response.py" in render
107. self.content = self.rendered_content
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/response.py" in rendered_content
84. content = template.render(context, self._request)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/backends/django.py" in render
66. return self.template.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render
207. return self._render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/loader_tags.py" in render
72. result = block.nodelist.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/template/library.py" in render
203. output = self.func(*resolved_args, **resolved_kwargs)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/dashboard/templatetags/edit_view_family_heading.py" in edit_view_family_heading
28. if family.lucy_guide:
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __get__
184. rel_obj = self.get_object(instance)
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in get_object
159. return qs.get(self.field.get_reverse_related_filter(instance))
File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/models/query.py" in get
380. self.model._meta.object_name
Exception Type: DoesNotExist at /dashboard/families/763/case-management
Exception Value: User matching query does not exist.
换句话说,视图使用的是正确的模板,当作为常规功能进行测试时,模板标记的行为符合预期,即使该族没有lucy\u指南
我怀疑我的数据库处于一种“奇怪”的状态,在这个相互关联的模型链的某个地方缺少了一些东西,但我正在努力缩小范围。对调试此错误有什么建议吗
更新
查看数据库(使用pgAdmin 4),问题中的系列
似乎有一个lucy\u guide\u id
:
但是,auth_user
表中没有与此id
对应的行:
我怀疑这与_delete=models上的有关。为包
外键设置_NULL
选项,但我在文档()中没有看到任何指示任何选项会允许数据库进入这种“损坏”状态的内容
你知道数据库是如何进入这种状态的吗?我又是如何在单元测试中重现这种错误的?我最后打电话给了
家族。lucy_guide
中的try
<代码>除块外:
try:
if family.lucy_guide:
heading.append(f'({family.lucy_guide.first_name})')
except ObjectDoesNotExist:
pass
其中,ObjectDoesNotExist
是从django.core.exceptions
导入的。页面现在正常加载
try:
if family.lucy_guide:
heading.append(f'({family.lucy_guide.first_name})')
except ObjectDoesNotExist:
pass