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ü
相关产品推荐
相关产品推荐

