资讯专栏INFORMATION COLUMN

宿舍得

lx1036 / 589人阅读

摘要:序列化输出定义序列化器字段的作用补充为列表,关系属性字段的三种方式获取序列化后的数据,,反序列化输入验证验证的调用接收数据继承获取查询字符串中的某个参数值获取查询字符串中的所有值返回一个字典获取请求体中的参数包括表单创建序列化器对象类字典进

1.序列化输出:

1.定义序列化器字段的作用
    1.
    2.
    补充:read_only,write_only

2.`JsonResponse({book_dict})`

JsonResponse({"bookinfo":book_dict_list}) # book_dict_list 为列表

  JsonResponse(book_dict_list,safe = False)

3.关系属性字段的三种方式
    1.hbook = PrimaryKeyRelatedField(read_only = True)
    2.hbook = StringRealtedField(read_only=True)
    3.hbook = bookinfoSerializer(read_only = True)
    4.heroinfo_set = PrimaryKeyRelatedField(read_only = True,many = True)
    5.heroinfo_set = StringRealtedField(read_only=True,many = True)
    6.heroinfo_set = bookinfoSerializer(read_only = True,many = True)

4.获取序列化后的数据:serializer.data ========> {}  or  [{},{},{}]

2.反序列化输入:

1.验证

2.验证的调用
    1.接收数据(继承APIView)
        next = request.query_params.get("next") :获取查询字符串中的某个参数值
        data_dict = request.query_params.dict():获取查询字符串中的所有值,返回一个字典
        data=request.data:获取请求体中的参数(包括表单,json)

    2.创建序列化器对象serializer = 类(data = 字典)
    3.serializer.is_valid()=======>进行验证===>True/False
        return JsonResponse(serializer.errors)
    4.serializer.errors===========>字典,异常信息(定义序列化器里面自定义的异常信息)
    serializer.validated_data
3.保存

4.保存的调用
    1.serializer=序列化器类型(data=***)===>默认选择create()方法
    2.serializer=序列化器类型(模型类对象,data=***,[partial = True])====>默认选择update()方法
    3.book = serializer.save() # 返回一个对象

5.序列化输出

3.APIView=============================================>继承自View

1.由来 : 发现View中每个方法里面都需要使用json转换,可以进一步封装

2.里面的方法
    get
    post
    put
    patch
    delete
3.response和resquest
    1.request.query_params.get()=======>获取查询字符串中的值,类型为字典
      request.data.get()======>获取请求报文体中的数据,类型为字典
    2.Response()   {} or [{},{},{},{}]  不需要safe = False

4.继承自View
    1.使用Resquest
    2.使用Response
    3.更好的异常处理
    4.在dispatch()前,进行了身份认证,权限判断,流量控制

3306 6379

4.GenericAPIView=================================>继承自APIView

1.由来: 发现继承自View的APIView,虽然已经减少了很多代码的重复,但是发现每个方法中只有
       查询的模型类对象,和要操作的序列化器名不一样,可以进一步封装

2.GenericAPIView+5个ModelMixin
    from rest_framework.mixin import *
    from rest_framework.generics import GenericAPIView
    查询多个(get)-------------------------------->list------>ListModelMixin
    创建(post)----------------------------------->create---->CreateModelMixin


    查询一个(接收主键)(get)---------------------->retrieve-->RetrieveModelMixin
    修改(接收主键)(put)-------------------------->update---->UpdateModelMixin
    删除(接收主键)(delete)----------------------->destory--->DestoryModelMixin

3.新添加的属性和方法
    1.属性:
        queryset
        serializer_class
        lookup_fileds------>默认为pk,因为有的方法接收主键的参数为pk(来自?P)

    2.方法:
        1.get_queryset()----->获取属性queryset的值,可重写
               重写场景 ----->比如说:需要修改"当前用户"的收货地址--->根据用户查询收货地址
               原因分析 ----->1.类创建的时候没有request对象--->2.执行get中的list()方法才会有request

        2.get_serializer_class()--->获取属性serializer_class的值,可重写
               重写场景 ----->不同情境选择不同的序列化器

        3.get_serializer()-------------->获取序列化器的对象------------>基本用不着
        4.get_object()------------------>获取根据pk查询到的对象-------->基本用不着


4.使用方法
    class HerosView(ListModelMixin,CreateModelMixin,GenericAPIView):
        # 自己指定查询语句
        queryset  =HeroInfo.object.all()
        # 自己指定序列化器
        serializer_class = HerInfoModelSerializer

        def get(self,request):
            # 查询所有:自己指定查询语句+序列化器
            return self.list(request)

        def post(self,request):
            # 创建一个:自己指定序列化器
            return self.create(request)

5.组合继承:========================>对GenericAPIView+5个ModelMixin的进一步封装,不需要写get,post,put,delete方法了

1.由来: 发现GenericAPIView+ModelMixin的每个方法里面都是返回对应的操作,如 return self.list(request)
                                                                         return self.create(request),可以进一步封装

HerosView
    list------------->ListAPIView----------------->继承自ListModelMixin+GenericAPIView
    create----------->CreateAPIView--------------->继承自CreateModelMixin+GenericAPIView
    list+create------>ListCreateAPIView----------->同理

HerosView
    retrieve--------->RetrieveAPIView
    update----------->UpdateAPIView
    destory---------->同理

    retrieve+update--------------->同理
    retrieve+destory-------------->同理
    # update+destory-------------->无
    retrieve+update+destory------->同理

6.视图集

1.由来: 发现组合继承(ListAPIView,ListCreateAPIView)中除了HerosView和HeroView不同以外,其他的都一样,可以进一步封装

2.合并的问题:在同一个了类中,不允许有同名的方法

3.解决问题:改方法的名称

4.新问题:如果改了名称,则dispatch()无法根据请求方法获取方法

5.新的解决问题: {"get":"list"},可自定义方法名了

6.字典的传入方法:views.HeroInfoViewSet.as_view({"get":"list"})

7.会多出一个action属性: if self.action == "list"
----------------------------------------------------------------------------
8.drf中默认的设置好的方法
    list     create 
    get      update     destory

9.drf提供的视图集-->4个

7.总结:

1.一步步封装:
    APIView: 发现View中每个方法里面都需要使用json转换,可以进一步封装发现View中每个方法里面都需要使用json转换,可以进一步封装
    GenericAPIView+5个ModelMixin: 发现继承自View的APIView,虽然已经减少了很多代码的重复,但是发现每个方法中只有
       查询的模型类对象,和要操作的序列化器名不一样,可以进一步封装
    组合继承: 发现GenericAPIView+ModelMixin的每个方法里面都是返回对应的操作,如 return self.list(request)
                                                                         return self.create(request),可以进一步封装
    视图集: 发现组合继承(ListAPIView,ListCreateAPIView)中除了HerosView和HeroView不同以外,其他的都一样,可以进一步封装


2.继承关系(---->)如下:
                                                         ---->ListAPIView---->ListModelMixin+GenericAPIView
                                                         |
                                                         |--->CreateAPIView-->CreateModelMixin+GenericAPIView
    View----->APIView-----> GenericAPIView+5个ModelMixin |
                                                         |..........
                                                         |
                                                         |
                                                         ---->一共9个

3.是视图的选择:
    APIView==========================>自己实现,不涉及模型类的操作
    GenericAPIView+5个ModelMixin:====>增删改查 部分操作

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42776.html

相关文章

  • 基于SSM的学生宿舍管理系统

    摘要:项目介绍本系统采用框架,数据层采用,数据库使用,可以用作毕业设计课程设计等,适合选题高校宿舍宿舍员工宿舍等,下面是大概的功能,具体功能实现可以建议看下方的演示视频,系统适合于基础一般的同学使用。 项目介绍: 本系统采用SSM框架,数据层采用mybatis,数据库使用mysql,可以用作毕业设...

    Backache 评论0 收藏0
  • 学生宿舍管理系统的设计与实现

    摘要:项目编号基于实现学校宿舍管理系统主要包含学生管理宿舍管理班级管理宿舍卫生管理访客管理收费管理管理员管理等功能。 项目编号:BS-GX-010 基于SSM实现学校宿舍管理系统:主要包含学生管理、宿舍管理、班级管理、宿舍卫生管理、访客管理、收费管理、管理员管理等功能。并能导出各模块数据到EXC...

    Riddler 评论0 收藏0
  • 基于javaweb+jsp的学生宿舍管理系统

    摘要:基于的学生宿舍管理系统部分代码实现楼栋不能为空编辑表单提交之前进行检查,如果,则不允许提交根据获取值姓名不能为空电话不能为空侧边栏 基于javaweb+jsp的学生...

    DandJ 评论0 收藏0
  • 物联网应用技术课程设计————宿舍升降机模型

    摘要:综合诸多考虑与相应调研,我们希望能够制作出一款宿舍升降机为同学们提供更方便安全的上下床方式。摘要本设计采用开发板作为主控,结合压力传感器红外避障传感器电机驱动模块实现了一个可以自动升降自动停止自动调速的宿舍升降机模型系统。 (第一次写博客,记录下自己大一时做的一个课设,如有不妥之处,还望多...

    Caicloud 评论0 收藏0
  • JAVA实战项目之 学生宿舍管理系统

    摘要:学生宿舍管理系统该项目采用技术,开发工具,项目含有源码配套开发软件软件安装教程项目发布教程功能介绍房间管理主要实现对房间信息的删除修改相关操作学生信息管理主要实现对学生信息的增加删除查询修改等相关操作住宿管理主要实现对宿舍的增加删除查询修 《学生宿舍管理系统》该项目采用技术swing,开发工...

    MiracleWong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<