Django中外键与视图处理报错排查
问题分析与解决
错误原因
你在视图中使用Consciousness.objects.get(inspection=inspection)时,若当前Inspection对象没有关联的Consciousness记录,get()方法会直接抛出DoesNotExist异常(报错里的Skin应该是当前Inspection实例的name值),而非处理无数据的情况。
解决方案
根据业务需求,可选择以下几种处理方式:
1. 确保每个Inspection必有对应Consciousness(无则返回404)
将get()替换为get_object_or_404,无关联记录时返回404页面而非报错:
def Detail(request, inspection_id): inspection = get_object_or_404(Inspection, pk=inspection_id) consciousness = get_object_or_404(Consciousness, inspection=inspection) context = {'inspection': inspection, 'consciousness': consciousness} return render(request, 'healthcare/detail.html', context)
2. 处理一个Inspection对应多个Consciousness的场景
外键默认是一对多关联,若一个Inspection可对应多个Consciousness,用filter()获取所有关联记录,模板循环展示:
views.py 修改:
def Detail(request, inspection_id): inspection = get_object_or_404(Inspection, pk=inspection_id) consciousness_list = Consciousness.objects.filter(inspection=inspection) context = {'inspection': inspection, 'consciousness_list': consciousness_list} return render(request, 'healthcare/detail.html', context)
模板修改:
<p>{{ inspection.name }}</p> {% for item in consciousness_list %} <p>{{ item.choice_text }}</p> {% empty %} <p>暂无相关记录</p> {% endfor %}
3. 允许Inspection无对应Consciousness(优雅处理空值)
用filter().first()获取第一条关联记录(无则返回None),模板中判断后再渲染:
views.py 修改:
def Detail(request, inspection_id): inspection = get_object_or_404(Inspection, pk=inspection_id) consciousness = Consciousness.objects.filter(inspection=inspection).first() context = {'inspection': inspection, 'consciousness': consciousness} return render(request, 'healthcare/detail.html', context)
模板修改:
<p>{{ inspection.name }}</p> {% if consciousness %} <p>{{ consciousness.choice_text }}</p> {% else %} <p>暂无相关记录</p> {% endif %}
内容的提问来源于stack exchange,提问作者Nursultan
相关产品推荐
相关产品推荐

