巢狀序列化create外來鍵
阿新 • • 發佈:2020-11-28
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>