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

Django技术问题:如何在视图中展示其他关联表的数据?

Django视图中展示多张表数据的实现方法

情况1:多张无关联的独立表

直接在视图中分别查询各表的数据集,将所有数据打包到上下文字典中传入模板即可。

修改后的视图代码:

def device(request):
    if request.method == 'GET':
        # 查询各表数据
        devices = Device.objects.all()
        # 替换成你实际需要的其他表模型
        maintenance_records = MaintenanceRecord.objects.all()
        device_categories = DeviceCategory.objects.all()
        
        # 统一传入模板的上下文
        context = {
            "devices": devices,
            "maintenance_records": maintenance_records,
            "device_categories": device_categories
        }
        # 无需单独判断数据集是否为空,模板内可处理空数据场景
        return render(request, 'device/device.html', context)

模板中可分别遍历各数据集:

<!-- 设备列表 -->
<h3>设备清单</h3>
{% if devices %}
    {% for dev in devices %}
        <p>{{ dev.name }} - {{ dev.sn }}</p>
    {% endfor %}
{% else %}
    <p>暂无设备数据</p>
{% endif %}

<!-- 维护记录 -->
<h3>设备维护记录</h3>
{% for record in maintenance_records %}
    <p>{{ record.device.name }}:{{ record.maintain_date }} - {{ record.content }}</p>
{% empty %}
    <p>暂无维护记录</p>
{% endfor %}

情况2:表之间存在关联关系(外键/一对一/多对多)

如果表之间有关联(比如Device关联DeviceCategory分类,MaintenanceRecord关联Device),可以用select_related或prefetch_related优化查询,避免多次数据库请求,同时直接在模板中访问关联数据。

假设模型关联如下:

# DeviceCategory模型
class DeviceCategory(models.Model):
    name = models.CharField(max_length=50)

# Device模型
class Device(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(DeviceCategory, on_delete=models.CASCADE)

# MaintenanceRecord模型
class MaintenanceRecord(models.Model):
    device = models.ForeignKey(Device, on_delete=models.CASCADE)
    maintain_date = models.DateField()
    content = models.TextField()

修改后的视图代码:

def device(request):
    if request.method == 'GET':
        # 预加载关联的分类(select_related处理外键/一对一)
        # 预加载关联的维护记录(prefetch_related处理反向一对多/多对多)
        devices = Device.objects.select_related('category').prefetch_related('maintenancerecord_set').all()
        
        context = {
            "devices": devices
        }
        return render(request, 'device/device.html', context)

模板中直接访问关联数据:

{% for dev in devices %}
    <div class="device-item">
        <h4>{{ dev.name }}</h4>
        <p>所属分类:{{ dev.category.name }}</p>
        <p>维护记录:</p>
        {% for record in dev.maintenancerecord_set.all %}
            <span>{{ record.maintain_date }}:{{ record.content }}</span>
        {% empty %}
            <span>暂无维护记录</span>
        {% endfor %}
    </div>
{% endfor %}

注意事项

  • 如果反向关联设置了related_name(比如device = models.ForeignKey(Device, on_delete=models.CASCADE, related_name='records')),模板中需用dev.records.all替代dev.maintenancerecord_set.all
  • select_related适合正向/反向的外键、一对一关联,prefetch_related适合多对多、反向一对多关联,两者结合能有效减少数据库查询次数

内容的提问来源于stack exchange,提问作者krisssz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:10:12