Django-rest-framework 接口实现 ModelSerializer 使用

ModelSerializer 使用

  • 不需要单独写字段的 序列化工具类 相当于 ModelForm

写法:以及 注意事项:

  1. 继承 serializers.ModelSerializer

  2. 在类中填写 class Meta: 指定数据

    • model=models.Books 指定表

      fields = '__all__' 指定字段

      depth = 1 # 所有有关系的字段都变成 read_only 一般不使用

      exclude = [] # 排除某个字段

      extra_kwargs = { } # 每个字段的一些额外参数
      'booksType': {'write_only': True},

  3. 对于特殊字段的 显示

    • 定义字段以及字段对应的方法
    • 字段名对应models 中的字段名 也可以不对应 只针对于特殊 显示 多选 外键 多对多
    • 指定为 serializers.SerializerMethodField(read_only=True)的字段类型
    • SerializerMethodField 会自动去找 get_字段名 的方法执行
    • 方法定义 方法名要加上get_的前缀 def get_booksType_info(self, book_obj):
    • book_obj 就是当前别序列化的对象

    方法中:

    • '''处理choices 字段''' 同样返回 对象的 choices字段 显示方法 get_字段名_display

      return book_obj.get_booksType_display()

    • '''处理 foreignkey 字段''' 调用 外键对应的 Serializer序列化类 参数传递 当前处理的 对象的 外键字段

      return PublisherSerializer(book_obj.publisher).data 使用 .data来获取被序列化的 内容并返回

    • '''处理 manytomany 字段''' 调用 外键对应的 Serializer序列化类 参数传递当前对象的多对多字段 用all()取出对应的 所有 内容 并给出 many=true 的参数进行循环 操作 因为对应的 事多条内容 .data取出序列化的内容 并返回

      return AuthorSerializer(book_obj.authors.all(),many=True).data

特殊字段的展示
  1. 对于页面中 原值字段的 显示问题 在Meta: 中 设置额外的字段来进行设置 设置为只能写入

class AuthorSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(max_length=32)

class PublisherSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(max_length=32)

class BooksModelSerializer(serializers.ModelSerializer):
    '''相当于 modelForm'''
    # SerializerMethodField 会自动去找 get_字段名 的方法执行
    # booksType_info = serializers.SerializerMethodField(read_only=True)
    # 简化写法 如果返回值是一行 可以不用写函数 根据 获取的  内容选择 字段
    booksType = serializers.CharField(source='get_booksType_display')
    publisher_info = serializers.SerialinmnnnnnnnnzerMethodField(read_only=True)
    authors_info = serializers.SerializerMethodField(read_only=True)

    def get_booksType_info(self, book_obj):
        '''处理choices 字段'''
        #  obj 就是当前被序列化的对象
        return book_obj.get_booksType_display()

    def get_publisher_info(self, book_obj):
        '''处理 foreignkey 字段'''
        # book_obj.publisher  ==> 得到和我这本书关联的出版社对象
        return PublisherSerializer(book_obj.publisher).data

    def get_authors_info(self, book_obj):
        '''处理 manytomany 字段'''
        print(book_obj)
        return AuthorSerializer(book_obj.authors.all(),many=True).data

    class Meta:
        model = models.Books
        fields = '__all__'
        # depth = 1  # 所有有关系的字段都变成 read_only
        # exclude = []  # 排除某个字段
        extra_kwargs = {  # 每个字段的一些额外参数
            'booksType': {'write_only': True},
            'publisher': {'write_only': True},
            'authors': {'write_only': True},
        }

转载于:https://www.cnblogs.com/zhang-zi-yi/p/10447323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值