如何在 Django 中显示相关对象集?

How do I display a related object set in django?

我知道这个问题似乎很容易回答,答案会在 API ref 的某个地方,但我对 django 有点陌生,并且已经通过 API 倾注了几天试图完成这项工作。任何帮助将不胜感激!

我正在为我大学的计算机实验室创建一个基本的博客应用程序,在这个应用程序中有两个相关页面。位置页面显示校园内每个实验室的信息(小时数,location/building),资源页面显示每个实验室的设备信息。

我的 models.py 文件如图所示设置(还有其他模型,但这些是唯一相关的模型:

class Location(models.Model):
    name = models.CharField(max_length=100)
    computer = models.ForeignKey('Computer')
    printer = models.ForeignKey('Printer')

class Computer(models.Model):
    computer_location = models.ForeignKey('Location', related_name='lab_computers')
    computer_model = models.ForeignKey('HardwareModel')

class Printer(models.Model):
    printer_location = models.ForeignKey('Location', related_name='lab_printers')
    printer_model = models.ForeignKey('HardwareModel')

class HardwareModel(models.Model):
    brand = models.CharField(max_length = 100)
    model_num = models.CharField(max_length = 30)

我的 views.py 文件:

class LocationsView(generic.ListView): #This isn't the view to be concerned with
    template_name = 'blog/location_list.html'
    context_object_name = 'locations'
    queryset = Location.objects.all()

#This is commented out because i was trying to modify the view to allow extra context
#I'm aware that you can't have 2 views with the same name. Just assume only one is active
#class ResourcesView(generic.ListView):
#    context_object_name = 'locations'
#    queryset = Location.objects.all()

def ResourcesView(request):
    locations = Location.objects.prefetch_related('lab_printers').all()
    return render_to_response('blog/resource_list.html',
          {'locations': locations})

我需要显示的模板是这样的:

<table>
    <tr>
        <th>Lab</th>
        <th>Device</th>
        <th>Type</th>
        <th>Model</th>
    </tr>
    {% for location in locations %}
    <tr>
        <td rowspan="{{ location.lab_printers.count }}">{{ location.name }}</td>
        <td>Computer</td>
        <td>{{ location.computer.computer_model.brand }}</td>
        <td>{{ location.computer.computer_model.model_num }}</td>
    </tr>
    <tr>
        <td>Printer</td>
        <td>{{ location.printer.printer_model.brand }}</td>
        <td>{{ location.printer.printer_model.model_num }}</td>
    </tr>
{% endfor %}
</table>

这样显示的目的是大学对如何在网页上显示信息有严格的指导方针,他们希望所有内容都井井有条 tables。 table 需要在第一列上有一个动态的 rowspan 以支持人们通过 django admin 添加或删除 computer/printer 类型。

我搜索了 Whosebug 并发现了一些与我类似的问题,他们说使用 prefetch_related 在一个批查询中获取相关对象,但是当我这样做时我开始得到一个 TypeError "RelatedManager" 在尝试访问模板中的打印机时不是可迭代的。我明白为什么会这样。这是因为处理查询的 RelatedManager class 没有 return list/array/tuple。我只是不知道我到底如何才能以我需要的方式访问我需要的信息。

我确实让它部分地与注释掉的通用视图一起工作,但是当我使用 location.lab_printers.count 返回的值不一致,没有反映数据库中的实际对象,弄乱了格式,导致缺少 td 元素和显示不准确。

对不起,如果我胡说八道,这只是一个复杂的问题,我完全运行不知道我应该如何去做。

我们将不胜感激任何帮助。感谢您的宝贵时间!

不是答案,但对 Location-ComputerLocation-Printer 关系使用 ManyToManyField。文档 link1, link2.