Django中如何获取包含OrderDetail的订单JSON列表?
解决Django订单列表关联OrderDetail数据的方案
1. 确认模型关联基础
先确保模型间的关联关系正确(以下为核心关联示例,可根据实际模型调整字段):
# models.py 核心关联代码 class Orders(models.Model): order_no = models.CharField(max_length=50) # 其他订单基础字段(如创建时间、状态等) class OrdersDetail(models.Model): order = models.ForeignKey(Orders, on_delete=models.CASCADE, related_name='details') driver = models.ForeignKey(Drivers, on_delete=models.CASCADE) truck = models.ForeignKey(Trucks, on_delete=models.CASCADE) product = models.ForeignKey(Products, on_delete=models.CASCADE) quantity = models.IntegerField() # 其他明细字段
2. 编写嵌套序列化器
通过多层嵌套序列化器,把关联的司机、卡车、产品、明细数据整合到订单结果中:
# serializers.py from rest_framework import serializers from .models import Orders, OrdersDetail, Drivers, Trucks, Products # 基础关联模型序列化器(按需选择返回字段) class DriverSerializer(serializers.ModelSerializer): class Meta: model = Drivers fields = ['id', 'name', 'license_no'] class TruckSerializer(serializers.ModelSerializer): class Meta: model = Trucks fields = ['id', 'plate_no', 'model'] class ProductSerializer(serializers.ModelSerializer): class Meta: model = Products fields = ['id', 'name', 'sku', 'price'] # 订单明细序列化器(嵌套基础模型序列化器) class OrderDetailSerializer(serializers.ModelSerializer): driver = DriverSerializer() truck = TruckSerializer() product = ProductSerializer() class Meta: model = OrdersDetail fields = ['id', 'driver', 'truck', 'product', 'quantity'] # 主订单序列化器(嵌套明细序列化器) class OrderSerializer(serializers.ModelSerializer): # 这里的details对应Orders模型中外键的related_name值 details = OrderDetailSerializer(many=True, read_only=True) class Meta: model = Orders fields = ['id', 'order_no', 'create_time', 'details'] # 订单基础字段+关联明细
3. 修改视图返回嵌套数据
在视图中使用新的序列化器,并通过预加载优化查询性能(避免N+1查询问题):
# views.py from rest_framework.response import Response from rest_framework.views import APIView from .models import Orders from .serializers import OrderSerializer class OrderListView(APIView): def get(self, request): # 预加载所有关联数据,提升查询效率 orders = Orders.objects.prefetch_related( 'details__driver', 'details__truck', 'details__product' ).all() serializer = OrderSerializer(orders, many=True) return Response(serializer.data)
4. 输出JSON示例(符合需求格式)
最终返回的JSON结构如下:
[ { "id": 1, "order_no": "ORD20240501001", "create_time": "2024-05-01T10:30:00Z", "details": [ { "id": 1, "driver": { "id": 101, "name": "张三", "license_no": "A123456" }, "truck": { "id": 201, "plate_no": "京A12345", "model": "解放J6" }, "product": { "id": 301, "name": "矿泉水", "sku": "PRO001", "price": 2.0 }, "quantity": 500 } ] } ]
关键注意事项
- 如果
OrdersDetail关联Orders时的related_name不是details,需同步修改序列化器中的字段名 - 可根据业务需求调整各序列化器的
fields列表,只返回必要字段 - 必须使用
prefetch_related预加载关联数据,否则会引发大量重复数据库查询
内容的提问来源于stack exchange,提问作者Derick T.
相关产品推荐
相关产品推荐

