2020-12-14 drf之视图

昨日回顾

1、序列化类

-写一个类继承Serializer或者ModelSerializer
-写字段(很多字段类),很多字段属性
-视图类中:实例化得到一个对象:
    -新增:data=字典
    -修改:instance,data
    -序列化:instance
-对象
    -对象.data
    -对象.error
    -对象.instance  都可以取到,

2、source

-修改序列化后字典的key(字段名和source对应的名不能一样)
-执行函数(直接连表操作)
-可以.连表操作

3、SerializerMethodField

-写在Serializer中
    publish=serializer.SerializerMethodField()
    def get_publish(self,obj):
-它不可以被反序列化
    -在Serializer中写两个字段,一个作为序列化字段,只读,一个作为反序列化字段,只写。

4、ModelSerializer(用的多)

-写一个类
-写一个内部类
    class Meta:
        model=表模型
        fields='__all__'
        fields=['id','name']
        exclude=()  排除哪些字段
        read_only_field=[]
        extra_kwargs={'name':{'required':True}}
        depth=1
-重写某些字段
    -直接以fields中的某个字段为字段名,继续写即可
-局部钩子,全局钩子,一样的用法

5、反序列化检验源码分析

6、many=True源码分析

-__new__和__init__和__call__
-对象()触发该对象类的__call__方法

7、请求响应

-Request对象
    -data  数据都在这里
    -__getattr__
-Response对象
    -data
    -status
    -headers
-通过配置实现前端只显示json格式
    -在settings中全局配置
    -在视图类中局部配
-def有一套默认的配置文件,自己配置需要在settings.py中
    REST_FRAMEWORK={}

今日内容

1、2个视图基类

Django REST Framework 提供的视图的主要作用:

控制序列化器的执行(检验,保存,转换数据)
控制数据库查询的执行

APIView:继承了原生Django的View

GenericAPIView:继承了APIView

-queryset=models.Book.object.all()
-serializer_class=serializer.BookModelSerializer
-get_queryset:获取配置的queryset
-get_object:路由中分组字段必须是pk,不然识别不了
-get_serializer:获取配置的序列化类

最终总结

两个基类

APIView:如果跟models没有关系(没有数据相关操作),就继承它
GenericAPIView:有关数据库操作,queryset和serializer_class

2、5个视图扩展类

5个视图扩展类(rest_framework.mixins)

CreateModelMixin : create方法创建一条
DestroyModelMixin :destroy方法删除一条
ListModelMixin :list方法获取所有
RetrieveModelMixin : retrieve方法获取一条
UpdateModelMixin :update方法修改一条

3、9个子类视图

9个子类视图(rest_framework.generics)

CreateAPIView:继承了CreateModelMixin,GenericAPIView,有post方法,新增数据

DestroyAPIView:继承了DestroyModelMixin,GenericAPIView,有delete方法,删除数据

ListAPIView :继承了ListModelMixin,GenericAPIView,有get方法,获取所有

UpdateAPIView:继承了UpdateModelMixin,GenericAPIView,有put和patch方法,修改数据

RetrieveAPIView:继承了RetrieveModelMixin,GenericAPIView,有get方法,获取一条



ListCreateAPIView:继承了ListModelMixin,CreateModelMixin,GenericAPIView,有get方法,获取所有,有post方法,新增功能

RetrieveUpdateAPIView:继承了RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有get方法获取一条,有update方法,修改功能

RetrieveDeleteAPIView:RetrieveModelMixin,DestroyModelMixin,GenericAPIView,有get方法,获取一条,有delete方法删除功能

RetrieveUpdateDeleteAPIView:继承了RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,有get方法获取一条,
有put、patch方法修改功能,有delete方法删除功能

4、视图集

#视图集有5个:全部方法的视图集ModelViewSet,只有查询的视图集ReadOnlyModelViewSet

#ViewSetMixin:就叫置入。重写了as_view(),继承了这个类,视图类中的方法名,就可以随便写,只要路由中做好映射就可以了

#ViewSet :继承了ViewSetMixin和APIView  混搭写法用它,就是自定义类中方法名

#GenericViewSet:继承ViewSetMixin,generic.GenericAPIView

#ModelViewSet:继承

mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet

# 只有查询的视图集
# ReadOnlyModelViewSet:继承

mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet

5、action的使用

#只要继承了ViewSetMixin类
#路由配置:path('books_mix/', views.BookView.as_view({'get':'lqz'}))
#视图类的方法中就会有个action

class BookView(ViewSet):
    def lqz(self,request,*args,**kwargs):
        print(self.action)  # 获取本次请求的视图方法名
        return Response('lqz')

#ViewSetMixin以后只要继承它,路由的配置就发生了变化,只需要写好映射即可

6、路由的使用

自动生成路由

#SimpleRouter 这个用到的多
#DefaultRouter 这生成的地址多,一般用不到,所以不常用

#继承了ViewSetMixin的视图类,以后写路由,可以自动生成

from rest_framework import routers
# 实例化得到一个对象
router = routers.SimpleRouter()
# 注册进路由
                 路径           对应的视图类,还可以后面写别名basename='book'
router.register('books', views.BookSetView)
# 把自动生成的路由配置到urlpatterns中,在路由列表后面写
    -urlpatterns += router.urls
    -re_path(r'v1/', include(router.urls))  # 路由分发

# 配置路由的方式三种
    -最原始的
        -path('books/', views.BookAPIView.as_view()),
    -ViewSetMixin的视图类
        -path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'}))
    -ViewSetMixin的视图类
        -自动生成,上面讲的

action

-当自动生成路由的时候,由于视图类中还有其它方法,是无法自动生成路由的
-加action装饰器:
    -methods:什么请求方式会触发被装饰函数的执行
    -detail:是True是基于带id的路由生成的,如果是False,是基于不带id的路由生成的
    -@action(methods=['get'], detail=True)

你可能感兴趣的:(2020-12-14 drf之视图)