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

FastAPI如何返回嵌套模型?关联Person与Registration表数据

关联Person与车辆信息并返回嵌套结构

1. 确认模型关联配置

首先保证Registration模型中,Person外键设置了related_name,方便从Person实例直接关联到对应的注册记录:

class Person(models.Model):
    name = models.CharField(max_length=100)
    # 其他自定义字段

class Car(models.Model):
    license_plate = models.CharField(max_length=20)
    brand = models.CharField(max_length=50)
    # 其他自定义字段

class Registration(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='registrations')
    car = models.ForeignKey(Car, on_delete=models.CASCADE)
    # 可选:注册时间等额外字段

2. 高效查询关联数据

使用prefetch_related配合select_related预取关联数据,避免多次数据库查询(N+1问题):

from django.db.models import Prefetch

# 查询所有Person,同时预取关联的registrations及对应的car信息
persons = Person.objects.prefetch_related(
    Prefetch('registrations', queryset=Registration.objects.select_related('car'))
).all()

3. 生成嵌套结构数据

方式一:用Django REST Framework序列化

编写嵌套序列化器,直接生成期望的JSON结构:

from rest_framework import serializers

class CarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car
        fields = ['id', 'license_plate', 'brand']  # 按需选择返回字段

class PersonSerializer(serializers.ModelSerializer):
    cars = serializers.SerializerMethodField()

    def get_cars(self, obj):
        # 从关联的registrations中提取车辆信息,组成数组
        return [CarSerializer(reg.car).data for reg in obj.registrations.all()]

    class Meta:
        model = Person
        fields = ['id', 'name', 'cars']  # 包含Person自身字段和嵌套的cars数组

方式二:手动构造字典(无DRF场景)

如果不用序列化框架,直接遍历查询结果构造嵌套字典:

person_result = []
for person in persons:
    person_data = {
        'id': person.id,
        'name': person.name,
        'cars': [
            {
                'id': reg.car.id,
                'license_plate': reg.car.license_plate,
                'brand': reg.car.brand
            } for reg in person.registrations.all()
        ]
    }
    person_result.append(person_data)

示例返回结构

最终输出的JSON格式如下:

[
    {
        "id": 1,
        "name": "张三",
        "cars": [
            {
                "id": 101,
                "license_plate": "京A12345",
                "brand": "特斯拉"
            },
            {
                "id": 102,
                "license_plate": "沪B67890",
                "brand": "比亚迪"
            }
        ]
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:40:45