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

Django中如何访问外键关联数据并在前端调用显示

解决方案

方法1:模板直接访问外键关联字段

无需修改视图,直接在前端模板中通过外键对象访问目标字段。假设Purchase_order的外键字段为customer,Customer模型包含customer_company字段,模板代码如下:

{% for order in purchase_orders %}
    <p>客户公司:{{ order.customer.customer_company }}</p>
{% endfor %}

若存在外键为空的场景,添加容错避免报错:

{{ order.customer.customer_company|default:"无关联客户" }}

方法2:为Customer模型定义__str__方法

修改Customer模型,让其__str__方法返回customer_company,这样无论在模板还是后台管理中,外键对象都会直接显示公司名称。

# models.py
class Customer(models.Model):
    customer_company = models.CharField(max_length=255)
    # 其他字段...

    def __str__(self):
        return self.customer_company

之后模板中可直接调用:

{{ order.customer }}

方法3:视图中预取关联数据(优化性能)

如果批量获取订单数据,为避免N+1查询问题,在视图中用select_related预取关联的Customer数据:

# views.py
from django.shortcuts import render
from .models import Purchase_order

def purchase_invoice(request):
    purchase_orders = Purchase_order.objects.all().select_related('customer')
    return render(request, 'invoice.html', {'purchase_orders': purchase_orders})

后续模板仍可使用方法1或方法2的写法,性能会大幅提升。

方法4:API序列化时指定字段(前后端分离场景)

若使用Django REST Framework构建API,在序列化器中嵌套客户字段或使用StringRelatedField:

# serializers.py
from rest_framework import serializers
from .models import Purchase_order, Customer

# 方式1:嵌套序列化器返回完整字段
class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = ('customer_company',)

class PurchaseOrderSerializer(serializers.ModelSerializer):
    customer = CustomerSerializer()

    class Meta:
        model = Purchase_order
        fields = ('id', 'customer', '其他订单字段...')

# 方式2:直接返回__str__结果
# class PurchaseOrderSerializer(serializers.ModelSerializer):
#     customer = serializers.StringRelatedField()
#     class Meta:
#         model = Purchase_order
#         fields = ('id', 'customer', '其他订单字段...')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:45:15