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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:26:27