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

