嵌套序列化create外键
class AppleModel(models.Model):
id=models.AutoField(primary_key=True)
app_name=models.CharField(max_length=50)
class Meta:
db_table='tbl_apple'
class PickleModel(models.Model):
pid=models.AutoField(primary_key=True)
app=models.ForeignKey(to="AppleModel",on_delete=models.CASCADE,related_name="pickle")
color=models.CharField(max_length=20)
class Meta:
db_table='tbl_pickle'
序列化器:
class SerPickle(serializers.ModelSerializer):
# source 格式Pickle模型外键模型字段名.主表的字段属性
#app_names=serializers.CharField(source="app.app_name",read_only=True)
class Meta:
model=PickleModel
# fields = "__all__"
fields = ["pid","color"]
extra_kwargs = {
"pid": {"read_only": True}
}
class SerApple(serializers.ModelSerializer):
pickle=SerPickle(many=True)
class Meta:
model=AppleModel
fields = ["id","app_name","pickle"]
extra_kwargs={
"id":{"read_only":True}
}
传参发送创建请求:

官方Django restframework 嵌套序列化示例:
https://www.django-rest-framework.org/api-guide/relations/
嵌套关系
与先前讨论的对另一个实体的引用相反,所引用的实体也可以嵌入或嵌套 在引用该实体的对象的表示中。这样的嵌套关系可以通过使用序列化器作为字段来表达。
如果该字段用于表示一对多关系,则应将many=True标志添加到序列化器字段。
例
例如,以下序列化器:
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'title', 'duration']
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True, read_only=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
可写的嵌套序列化器
默认情况下,嵌套串行器是只读的。如果要支持对嵌套序列化器字段的写操作,则需要创建create()和/或update()方法,以明确指定应如何保存子关系:
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'title', 'duration']
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album
>>> data = {
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
{'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
{'order': 2, 'title': 'What More Can I Say', 'duration': 264},
{'order': 3, 'title': 'Encore', 'duration': 159},
],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>
反向关系
请注意,ModelSerializer和HyperlinkedModelSerializer类不会自动包含反向关系。要包括反向关系,必须将其显式添加到字段列表中。例如:
class AlbumSerializer(serializers.ModelSerializer):
class Meta:
fields = ['tracks', ...]
通常,您需要确保related_name在关系上设置了适当的参数,可以用作字段名称。例如:
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
...
如果尚未为反向关系设置相关名称,则需要在fields参数中使用自动生成的相关名称。例如:
class AlbumSerializer(serializers.ModelSerializer):
class Meta:
fields = ['track_set', ...]


浙公网安备 33010602011771号