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

