嵌套序列化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>

 

反向关系

请注意,ModelSerializerHyperlinkedModelSerializer不会自动包含反向关系要包括反向关系,必须将其显式添加到字段列表中。例如:

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

 

posted @ 2020-11-28 17:43  不带R的墨菲特  阅读(230)  评论(0)    收藏  举报