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', ...]