1. 程式人生 > 實用技巧 >巢狀序列化create外來鍵

巢狀序列化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>