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},
        }

posted @ 2019-02-27 21:59  拐弯  阅读(633)  评论(0编辑  收藏  举报