zoukankan      html  css  js  c++  java
  • 嵌套序列化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', ...]
  • 相关阅读:
    Extjs知识点汇总
    div设置滚动条内容任然显示不全
    win7 系统安装 docker
    docker常用命令
    cargo实现自动化部署远程jetty容器(非安全模式)
    win7 失去焦点解决方案
    jeecms 评论相关
    jeecms v8 网站访问量配置
    python——进程池
    python多进程编程常用到的方法
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/14053354.html
Copyright © 2011-2022 走看看