You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:01:06