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

Django中通过关联模型链获取关联Personel对象的问题

问题解决方法

错误原因

你使用prefetch_related('proje__santiye__personel_set')报错,核心问题是Django中外键反向关联的默认命名规则:Proje通过firma外键指向Sirket,所以Sirket对象的反向关联默认名称是proje_set(而非proje),Django找不到名为proje的关联字段,因此抛出错误。


1. 修正视图查询语句

修改views.py中的查询逻辑,使用正确的反向关联路径,同时优化变量名避免与循环变量重名:

def firma(request):
    # 正确的预取关联路径:Sirket→Proje(proje_set)→Santiye(santiye_set)→Personel(personel_set)
    sirketler = Sirket.objects.all().prefetch_related('proje_set__santiye_set__personel_set').order_by('id')
    return render(request, '你的模板路径.html', {'sirketler': sirketler})

2. 修正模板遍历逻辑

模板中需要逐层遍历关联对象,不能直接引用未定义的santiye变量,嵌套循环结构如下:

<div class="container">
    <div class="row">
        {% for sirket in sirketler %}
            <div class="card mb-3">
                <div class="row">
                    <div class="col-md-3"></div>
                    <div class="col-md-9">
                        <div class="card-body">
                            <h5 class="card-title">{{ sirket.isim }}</h5>
                            <p class="card-text"><b>Çalışan Personeller:</b></p>
                            <ul>
                                {% for proje in sirket.proje_set.all %}
                                    {% for santiye in proje.santiye_set.all %}
                                        {% for personel in santiye.personel_set.all %}
                                            <li>{{ personel.ad }}</li>
                                        {% endfor %}
                                    {% endfor %}
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        {% endfor %}
    </div>
</div>

可选优化:自定义反向关联名称

如果觉得默认的_set命名可读性差,可以在模型外键字段中设置related_name简化名称:

修改models.py

class Proje(models.Model):
    # ...其他字段
    firma = models.ForeignKey(Sirket, on_delete=models.CASCADE, related_name='projeler')

class Santiye(models.Model):
    # ...其他字段
    baglanti = models.ForeignKey(Proje, on_delete=models.CASCADE, related_name='santiyeler')

class Personel(models.Model):
    # ...其他字段
    birim = models.ForeignKey(Santiye, on_delete=models.CASCADE, null=True, related_name='personeller')

对应的视图查询

sirketler = Sirket.objects.all().prefetch_related('projeler__santiyeler__personeller').order_by('id')

对应的模板循环

{% for proje in sirket.projeler.all %}
    {% for santiye in proje.santiyeler.all %}
        {% for personel in santiye.personeller.all %}
            <li>{{ personel.ad }}</li>
        {% endfor %}
    {% endfor %}
{% endfor %}

内容的提问来源于stack exchange,提问作者Ozan Gözlüklü

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:28:17