Djang工程搭建基础4

1,序列化器概述
  • image-20190310095836741
2,DRF的使用
  • Django restful framework: 开发符合restful风格的接口

    • 1, 使用其提供的序列化器(数据转换和校验)
    • 2, 视图的功能(业务的处理)
    • 3,路径的处理
  • 使用DRF体验restful开发的便捷

  • 使用流程:

    • 1,需要安装drf扩展

      • pip install djangorestframework
    • 2,将rest_framework需要注册到INSTALLED_APPS中

      
      

      image-20190310113913474

3,序列化器定义
  • 作用:

    • 1, 将前端的JSON(dict), 转成后端的模型 反序列化
      2, 对前端提交过来的数据必须校验(我们不相信前端的任何数据)
      3, 将后端的模型, 转换成前端的JSON 序列化
  • 定义格式:

  • 1, 创建类,继承自Serializer类(在子应用中定义serializers.py定义)
    2, 编写字段,序列化器和模型类中的名字一样
    3, 编写字段类型,也需要和模型类中的一样
    4, 编写参数选项
    label: 暂时理解成字段的注释
    read_only: 只读

  • 具体的代码:

    #1,定义书籍的序列化器
    class BookInfoSerializer(serializers.Serializer):
        id = serializers.IntegerField(label="书籍id",read_only=True)
        btitle = serializers.CharField(label="书籍名",max_length=20)
        bpub_date = serializers.DateField(label="发布日期")
        bread = serializers.IntegerField(label="阅读量")
        bcomment = serializers.IntegerField(label="评论量")
    
4,序列化器基本使用
  • 作用: 序列化了单个对象数据

  • 代码:

    from booktest.models import BookInfo
    from booktest.serializers import BookInfoSerializer
    
    #1,查询数据
    book = BookInfo.objects.get(id=1)
    
    #2,定义序列化器对象
    #instance: 表示需要序列化的对象
    serializer = BookInfoSerializer(instance=book)
    
    #3,输出
    serializer.data
    
5,序列化器列表数据
  • 作用: 将列表中的所有,对象数据, 转成JSON(字典)数据

  • 代码

    from booktest.models import BookInfo
    from booktest.serializers import BookInfoSerializer
    
    #1,查询数据
    book = BookInfo.objects.all()
    
    #2,定义序列化器对象
    #instance: 表示需要序列化的对象
    #many: 告诉序列化器传入的是一个列表
    serializer = BookInfoSerializer(instance=book,many=True)
    
    #3,输出
    serializer.data
    
6,英雄序列化器关联外键
  • 作用: 在输出英雄序列化数据的时候显示关联的外键内容

        #一,关联外键
        #read_only=`True`.表示在序列化的时候只能读取,不能修改
        #`queryset`: 给字段加上一个查询集,在进行序列化的时候会读取里面的具体数据
        # 或者,hbook = serializers.PrimaryKeyRelatedField(read_only=True)
        # hbook = serializers.PrimaryKeyRelatedField(queryset=BookInfo.objects.all())
    
        #二,关联名字,实际上调用的是Bookinfo模型类中的__str__方法
        hbook = serializers.StringRelatedField()
    
        #三,关联对象的序列化器
        hbook = BookInfoSerializer()
    
7,书籍序列化器关联属性many
  • 作用: 在序列化书籍的时候, 输出英雄的内容

        #many=True: 关联英雄的字段,因为书籍可以被多个英雄去关联所以需要设置
        #read_only=`True`.表示在序列化的时候只能读取,不能修改
        heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)
    
    
9,反序列化,数据类型验证
  • 作用: 对传入的数据类型校验

    1, 使用序列化器字段校验
        比如:
            IntegerField, 校验这个数是否是整数
            CharField, 是否是字符串
            DateField, 需要是日期格式
            
            注意点: 整数和字符串可以相互转换,但是不能随意写
    
10,反序列化,选项验证
  • 作用: 验证选项的值是否符合需求,比如: 长度是多少,比如是否一定要传递等

    2, 字段的参数选项校验
        read_only, 只读, 在序列化中有效
        required, 默认就是True,是否必须需要传递,
        CharField: max_length , min_length 校验数据的范围
        IntegerField: max_value,   min_value, 校验数据的范围
        
    
11,反序列化,单个字段验证
  • 作用: 验证单个字段的合法性

    3, 单个字段的校验
        格式:
            def validate_字段名字(self,value):
                return value
                
            解释: 校验通过必须返回, 校验不通过抛出异常
                
        #单独对btitle进行校验
        def validate_btitle(self,value):
            """
                value:传入的就是需要校验的btitle
            """
            #1,校验数据
            if not "django" in value:
                raise serializers.ValidationError("btitle must container django")
    
            #2,校验成功需要返回
            return value
    
    
12,反序列化,多个字段validate验证
  • 作用: 校验多个字段之间的关系

    4,多个字段校验
        格式:attrs,传入过来的字典数据
            def validate(self,attrs):
            
                return attrs
            解释: 校验通过必须返回, 校验不通过抛出异常
                
                
         #多个字段校验
        def validate(self, attrs):
            """
            attrs就是传递过来的book_dict数据
            book_dict = {
                "btitle":"python django",
                "bpub_date":"2000-1-1",
                "bread":10
                "bcomment":3
            }
            """
            if attrs.get("bcomment") > attrs.get("bread"):
                raise serializers.ValidationError("评论量不能大于阅读量")
    
            return attrs
    
    
13,反序列化,自定义验证方法(理解)
#定义校验方法(自定义方法校验)
def check_bpub_date(value):

    if value.year < 2019:
        raise serializers.ValidationError("添加的书籍必须是2019年之后")

    return value
bpub_date = serializers.DateField(label="发布日期",required=True,validators=[check_bpub_date])

14,反序列化,create保存数据
  • 作用: 将反序列化,校验成功之后的数据,保存到数据库中

        #实现create方法
        def create(self, validated_data):
            """
            validated_data:就是校验成功之后的数据data
            data = {
                "btitle": "django 基础",
                "bpub_date": "2019-1-1",
                "bread": 2,
                "bcomment": 1
            }
            """
            #1.创建book对象
            # book = BookInfo.objects.create(
            #     btitle=validated_data.get("btitle"),
            #     bpub_date=validated_data.get("bpub_date"),
            #     bread=validated_data.get("bread"),
            #     bcomment=validated_data.get("bcomment"),
            # )
    
            book = BookInfo.objects.create(**validated_data)
    
            #2.创建成功之后返回book对象
            return book
    
    
15,反序列化,update更新数据
  • 作用: 将反序列化,校验成功之后的数据,更新到数据库中

        def update(self, instance, validated_data):
            """
                instance:表示需要更新的对象,就是传进来的,book
                validated_data:校验成功之后的数据,就是data
                data = {
                    "btitle": "django 高级",
                    "bpub_date": "2019-1-1",
                    "bread": 2,
                    "bcomment": 1
                }
            """
            #1,更新数据
            instance.btitle = validated_data.get("btitle",instance.btitle)
            instance.bpub_date = validated_data.get("bpub_date",instance.bpub_date)
            instance.bread = validated_data.get("bread",instance.bread)
            instance.bcomment = validated_data.get("bcomment",instance.bcomment)
            instance.save()
    
            return instance
    
    
16,ModelSerializer序列化器
  • 作用: 快速生成序列化器字段,create,update方法

    #定义书籍的,模型类序列化器
    class BookInfoModelSerializer2(serializers.ModelSerializer):
    
        class Meta:
            #1,参考BookInfo,生成序列化器的字段
            model = BookInfo
    
            #2,指定生成字段
            fields = "__all__" #生成所有
            # fields = ["id","btitle","bpub_date","bread","bcomment"] #生成指定
            # exclude = ("id","is_delete","bimage") #不要哪些字段
    
            #3,修改参数选项
            # extra_kwargs = {
          
          
            #     "bread":{"max_value":100,"min_value":0},
            #     "bcomment":{"required":True}
            # }
    
            #4,指定哪些字段,只读(序列化)
            # read_only_fields = ["bimage","is_delete"]
    
    
    

猜你喜欢

转载自blog.csdn.net/weixin_44774466/article/details/88555106