Django Rest Framework如何序列化关联对象实现嵌套创建功能
DRF嵌套序列化实现创建主模型时同步创建关联从模型方案
你需要的功能在DRF中的专业术语是可写嵌套序列化器(Writable Nested Serializers),具体实现步骤如下:
1 补全模型定义
首先给外键字段添加related_name参数,用于后续序列化器关联嵌套字段:
# models.py from django.db import models class Flight(models.Model): # 替换为你实际的字段定义,以下为示例 field_1 = models.CharField(max_length=100) field_2 = models.IntegerField() field_3 = models.TextField(blank=True) class Approach(models.Model): # 添加related_name参数,值对应后续序列化器的嵌套字段名 flight_object = models.ForeignKey(Flight, on_delete=models.CASCADE, related_name="approaches") approach_type = models.CharField(max_length=50) number = models.IntegerField()
2 编写嵌套序列化器
DRF默认的嵌套序列化器仅支持读取,需要重写create方法实现写入逻辑:
# serializers.py from rest_framework import serializers from .models import Flight, Approach class ApproachSerializer(serializers.ModelSerializer): class Meta: model = Approach # 排除外键字段,创建时会自动关联主表对象 fields = ["approach_type", "number"] class FlightSerializer(serializers.ModelSerializer): # 嵌套从表序列化器,many=True表示一对多关联 approaches = ApproachSerializer(many=True) class Meta: model = Flight fields = ["id", "field_1", "field_2", "field_3", "approaches"] def create(self, validated_data): # 提取从表数据 approaches_data = validated_data.pop("approaches") # 先创建主表Flight对象 flight = Flight.objects.create(**validated_data) # 批量创建关联的Approach对象 for approach_item in approaches_data: Approach.objects.create(flight_object=flight, **approach_item) return flight
3 编写视图
直接使用通用视图即可,无需额外改造:
# views.py from rest_framework import viewsets from .models import Flight from .serializers import FlightSerializer class FlightViewSet(viewsets.ModelViewSet): queryset = Flight.objects.all() serializer_class = FlightSerializer
按照常规逻辑配置路由后即可使用。
4 React Native端提交格式要求
前端提交的POST请求体按照以下JSON结构传参即可:
{ "field_1": "航班字段1值", "field_2": 123, "field_3": "航班字段3值", "approaches": [ {"approach_type": "进近类型1", "number": 1}, {"approach_type": "进近类型2", "number": 2} ] }
补充说明
如果需要支持更新Flight时同步修改关联的Approach数据,重写序列化器的update方法即可,逻辑与create类似:先更新主表字段,再处理从表的增删改逻辑。
内容的提问来源于stack exchange,提问作者user2498975
相关产品推荐
相关产品推荐

