Django DetailView:相关对象

问题描述

有 4 个模型:

models.py

class Buildings(models.Model):
    name = models.CharField(max_length=25)

class Zones(models.Model):
    name = models.CharField(max_length=25)

class Departments(models.Model):
    name = models.CharField(max_length=25)
    zone = models.ForeignKey(Zones,related_name='departments')

class Rooms(models.Model):
    name = models.CharField(max_length=25)
    department = models.ForeignKey(Departments,related_name='rooms')
    building = models.ForeignKey(Buildings,related_name='buildings')

我想做的是:

创建我们看到的建筑物的DetailView:

  • 大楼内的部门
  • 建筑物内的房间
  • 每个房间所属的区域

现在在 views.py我有

class BuildingsDetailView(DetailView):
    model = Buildings

    def get_context_data(self,**kwargs):
        context = super(BuildingsDetailView,self).get_context_data(**kwargs)
        context['Rooms'] = Rooms.objects.filter(building=self.get_object())
        context['Zones'] = Zones.objects.filter(departments__rooms__buildings=self.get_object())
        return context

detail.html 在 DetailView 中,我现在可以访问房间、部门和区域,但我无法将区域与房间匹配。它会正确打印带有部门的建筑物和房间,然后将其与建筑物中的所有区域相乘。

{% for rm in Rooms %}
    {% for zn in Zones %}
        <p> {{ rm.name }} </p>
        <p> {{ rm.department }} </p>
        <p> {{ zn.name }} </p>
    {% endfor %}
{% endfor %}

输出

Room 1
Depart A
Zone 1

Room 1
Depart A
Zone 2

如何将区域名称与建筑物中每个房间的相应部门正确匹配? 房间和出发地名称匹配正确。

解决方法

您正在遍历不匹配的单独查询集,只需从您拥有的实例访问相关模型。在模板中试试这个:

{% for rm in Rooms %}
    <p> {{ rm.name }} </p>
    <p> {{ rm.department }} </p>
    <p> {{ rm.department.zone.name }} </p>
{% endfor %}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...