1,APIView之request
- 目的: 知道APIView的作用, 以及可以通过request获取请求参数
- 作用:
- 1, 继承自View
- 2, 封装了自己的request,response
- 3, 提供认证,限流,权限等功能
- 获取参数:
- request.query_params : 通过get请求提交的查询参数
- request.data: 通过post提交的表单或者非表单获取数据方式
2,APIView之Response
- 目的: 可以使用Response返回不同类型的数据,以及配合状态码使用
- 作用:
- 1, 不管响应的是文本还是json数据,全部都统一使用Response类
- 2, 可以配合状态码使用, 见名知意
- 3, 可以根据前端请求头中的Accept类型自动返回对应的数据
3,APIView实现列表视图
-
目的: 可以使用APIView中的request和response, 以及序列化器实现列表视图
-
操作流程:
-
1, 子路由
-
url(r'^api_view_list/',views.BookListView.as_view()),
-
-
2, 类视图
-
#3,使用一级视图, APIView 配合 序列化器 实现列表视图 class BookListView(APIView): def get(self,request): #1,查询所有书籍 books = BookInfo.objects.all() #2,数据转换 serializer = BookInfoModelSerializer(instance=books,many=True) #3,返回响应,safe=False允许非字典返回 return Response(serializer.data,status=status.HTTP_200_OK) def post(self,request): #1,获取参数 dict_data = request.data #2,校验参数,入库 serializer = BookInfoModelSerializer(data=dict_data) serializer.is_valid(raise_exception=True) serializer.save() #3,返回响应 return Response(serializer.data,status=status.HTTP_201_CREATED)
-
-
4,APIView实现详情视图
-
目的: 可以使用APIView配合序列化器实现详情视图
-
操作流程:
-
1, 子路由
-
url(r'^api_view_detail/(?P<pk>\d+)/$',views.BookDetailView.as_view()),
-
-
2, 类视图
-
#4,使用一级视图, APIView 配合 序列化器 实现详情视图 class BookDetailView(APIView): def get(self,request,pk): #1,获取书籍 book = BookInfo.objects.get(id=pk) #2,数据转换 serializer = BookInfoModelSerializer(instance=book) #3,返回响应 return Response(serializer.data,status=status.HTTP_200_OK) def put(self,request,pk): #1,获取参数 dict_data = request.data book = BookInfo.objects.get(id=pk) #2,校验参数,数据入库 serializer = BookInfoModelSerializer(instance=book,data=dict_data) serializer.is_valid(raise_exception=True) serializer.save() #3,返回响应 return Response(serializer.data,status=status.HTTP_201_CREATED) def delete(self,request,pk): #1,获取数据 book = BookInfo.objects.get(id=pk) #2,删除对象 book.delete() #3,返回响应 return Response({"errno":0,"errmsg":"删除成功"},status=status.HTTP_204_NO_CONTENT)
-
-
5,二级视图,实现列表视图
-
目的: 知道二级视图创建的属性和方法, 以及能够实现列表视图
-
操作流程:
-
0,子路由
-
url(r'^generic_view/$',views.BookListGenericView.as_view()),
-
-
1, 类视图
-
#5,二级视图GenericAPIView,实现列表视图 """ GenericAPIView特点: 1, GenericAPIView,继承自APIView,为列表视图,详情视图添加了常用的方法和属性。 属性: serializer_class: 指定通用的序列化器 queryset: 指定通用的数据源 方法: get_serializer: 获取序列化器 get_queryset: 获取数据源 2, GenericAPIView可以配合一个或多个mixin类使用。 """ class BookListGenericView(GenericAPIView): #1,给视图提供,常见(通用)的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() def get(self,request): #1,查询所有书籍 # books = self.queryset.all() books = self.get_queryset() #和上面等价 #2,数据转换 # serializer = BookInfoModelSerializer(instance=books,many=True) # serializer = self.serializer_class(instance=books,many=True) serializer = self.get_serializer(instance=books,many=True) #和上面等价 #3,返回响应,safe=False允许非字典返回 return Response(serializer.data,status=status.HTTP_200_OK) def post(self,request): #1,获取参数 dict_data = request.data #2,校验参数,入库 # serializer = BookInfoModelSerializer(data=dict_data) # serializer = self.serializer_class(data=dict_data) serializer = self.get_serializer(data=dict_data) #和上面等价 serializer.is_valid(raise_exception=True) serializer.save() #3,返回响应 return Response(serializer.data,status=status.HTTP_201_CREATED)
-
-
6,二级视图,实现详情视图
-
目的: 可以通过二级视图GenericAPIView实现详情视图
-
操作流程:
-
1, 子路由
-
url(r'^generic_view/(?P<pk>\d+)/$',views.BookDetailGenericView.as_view()),
-
-
2, 类视图
-
#6,二级视图GenericAPIView,实现详情视图 class BookDetailGenericView(GenericAPIView): #1,给类视图中的方法,提供通用的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() def get(self,request,pk): #1,获取书籍 # book = BookInfo.objects.get(id=pk) book = self.get_object() #和上面等价 #2,数据转换 serializer = BookInfoModelSerializer(instance=book) #3,返回响应 return Response(serializer.data,status=status.HTTP_200_OK) def put(self,request,pk): #1,获取参数 dict_data = request.data # book = BookInfo.objects.get(id=pk) book = self.get_object() #2,校验参数,数据入库 serializer = BookInfoModelSerializer(instance=book,data=dict_data) serializer.is_valid(raise_exception=True) serializer.save() #3,返回响应 return Response(serializer.data,status=status.HTTP_201_CREATED) def delete(self,request,pk): #1,获取数据 # book = BookInfo.objects.get(id=pk) book = self.get_object() #2,删除对象 book.delete() #3,返回响应 return Response({"errno":0,"errmsg":"删除成功"},status=status.HTTP_204_NO_CONTENT)
-
-
7,get_object方法
- 目的: 知道get_object的作用
- 作用:
- 根据lookup_field在数据源中获取一个对象
- 二级视图属性,方法总结:
- 属性:
- serializer_class: 指定通用的序列化器
- queryset: 指定通用的数据源
- lookup_field: 给详情视图指定获取对象的参数
- 方法:
- get_seriariazer: 获取序列化器
- get_queryset: 获取数据源
- get_object: 根据lookup_field在数据源中获取一个对象
- 属性:
8,MiXin
-
目的: 知道mixin的作用,以及常见的mixin类
-
操作流程:
-
mixin 给列表视图,详情视图提供通用的功能 比如: get()和.post(), put()等等。这些方法操作可以随意组合。 类名称 方法 功能 ListModelMixin list 获取所有数据 CreateModelMixin create 创建单个对象 RetrieveModelMixin retrieve 获取单个对象 UpdateModelMixin update 更新单个对象 DestroyModelMixin destroy 删除单个对象
-
9,二级视图,MiXin配合使用
-
目的: 可以通过二级视图GenericAPiView和mixin实现列表和详情视图
-
列表视图操作流程:
-
1, 子路由
-
url(r'^generic_mixin_view/$',views.BookListGenericMixinView.as_view())
-
-
2, 类视图
-
#8,二级视图GenericAPIView + mixin实现列表视图 class BookListGenericMixinView(ListModelMixin,CreateModelMixin,GenericAPIView): #1,给视图提供,常见(通用)的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() def get(self,request): return self.list(request) def post(self,request): return self.create(request)
-
-
-
详情视图操作流程:
-
1, 子路由
-
url(r'^generic_mixin_view/(?P<pk>\d+)/$',views.BookDetailGenericMixinView.as_view()),
-
-
2, 类视图
-
#9,二级视图GenericAPIView + mixin实现详情视图 class BookDetailGenericMixinView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView): #1,给类视图中的方法,提供通用的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() def get(self,request,pk): return self.retrieve(request) def put(self,request,pk): return self.update(request) def delete(self,request,pk): return self.destroy(request)
-
-
10,三级视图
-
目的: 知道三级视图的作用, 以及常见的三级视图
-
操作流程:
-
三级视图特点: 是具体的通用视图。可以提供通用的行为,除非有特殊的行为, 那么才需要自定义。 类名称 方法 父类 作用 CreateAPIView post GenericAPIView, 创建单个对象 CreateModelMixin ListAPIView get GenericAPIView, 获取所有对象 ListModelMixin RetrieveAPIView get GenericAPIView, 获取单个对象 RetrieveModelMixin DestroyAPIView delete GenericAPIView, 删除单个对象 DestroyModelMixin UpdateAPIView put GenericAPIView, 更新单个对象 UpdateModelMixin
-
11,三级视图,实现列表,详情视图
-
目的: 使用三级视图,实现列表,详情视图
-
操作流程:
-
1, 子路由
-
url(r'^three_view/$',views.BookListThreeView.as_view()), url(r'^three_view/(?P<pk>\d+)/$',views.BookDetailThreeView.as_view()),
-
-
2, 类视图
-
#11,三级视图,实现列表,详情视图 class BookListThreeView(CreateAPIView,ListAPIView): #1,给视图提供,常见(通用)的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() class BookDetailThreeView(DestroyAPIView,UpdateAPIView,RetrieveAPIView): #1,给类视图中的方法,提供通用的属性 serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all()
-
-
12,视图集
-
目的:知道视图集的作用, 以及常见的视图集
-
操作流程:
-
特点: 1, 可以将多个操作组合在一起 2, 可以进行路由映射 类名称 父类 作用 ViewSet APIView 可以进行路由映射 ViewSetMixin GenericViewSet GenericAPIView 可以进行路由映射 ViewSetMixin ModelViewSet GenericViewSet 可以进行路由映射,列表,详情视图功能 5个mixin类 ReadOnlyModelViewSet GenericViewSet 可以进行路由映射,获取所有,获取单个 list,retrieve,mixin类
-
13,ViewSet
-
目的: 知道如何使用viewSet将获取单个,和获取所有组合在一起
-
操作流程:
-
1,子路由
-
url(r'^view_set/$',views.BookViewSet.as_view({'get': 'list'})), url(r'^view_set/(?P<pk>\d+)/$',views.BookViewSet.as_view({'get': 'retrieve'})),
-
-
2,类视图
-
#13,ViewSet实现获取多个,单个数据 from django.shortcuts import get_object_or_404 from rest_framework import viewsets from rest_framework.response import Response class BookViewSet(viewsets.ViewSet): """ A simple ViewSet for listing or retrieving users. """ def list(self, request): queryset = BookInfo.objects.all() serializer = BookInfoModelSerializer(instance=queryset, many=True) return Response(serializer.data) def retrieve(self, request, pk=None): queryset = BookInfo.objects.all() book = get_object_or_404(queryset, pk=pk) serializer = BookInfoModelSerializer(book) return Response(serializer.data)
-
-
14,ReadOnlyModelViewSet
-
目的: 可以使用该类实现获取所有,获取单个数据
-
操作流程:
-
1, 子路由
-
url(r'^readonly_view_set/$', views.BookReadOnlyModelViewSet.as_view({'get': 'list'})), url(r'^readonly_view_set/(?P<pk>\d+)/$', views.BookReadOnlyModelViewSet.as_view({'get': 'retrieve'})),
-
-
2, 类视图
-
#13,ReadOnlyModelViewSet实现获取所有,单个数据 class BookReadOnlyModelViewSet(ReadOnlyModelViewSet): serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all()
-
-
15,ModelViewSet
-
目的: 可以使用ModelViewSet实现列表,详情视图功能
-
操作流程:
-
1, 子路由
-
url(r'^model_view_set/$', views.BookModelViewSet.as_view({'get': 'list','post':"create"})), url(r'^model_view_set/(?P<pk>\d+)/$', views.BookModelViewSet.as_view({'get': 'retrieve','put':"update",'delete':"destroy"})),
-
-
2, 类视图
-
#14,ModelViewSet实现列表,详情视图功能 class BookModelViewSet(ModelViewSet): serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all()
-
-
16,视图集额外动作
-
目的: 可以在视图集中定义额外的方法,获取指定条件的数据
-
操作流程:
-
1, 子路由
-
url(r'^bread_grate_condition/$', views.BookModelViewSet.as_view({'get': 'get_bread'})),
-
-
2, 类视图
-
#14,ModelViewSet实现列表,详情视图功能 class BookModelViewSet(ModelViewSet): serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() #1,获取阅读量大于等于20的书籍 def get_bread(self,request): #1,查询书籍大于20的 books = BookInfo.objects.filter(bread__gte=20).all() #2,数据转换 serializer = self.get_serializer(instance=books,many=True) #3,返回响应 return Response(serializer.data,status=status.HTTP_200_OK)
-
-
-
注意点:
- 1, 给视图集添加额外的方法之后, 必须要使用映射形式才能访问
- 2, 只有视图集能够进行路由映射,普通的1,2,3级视图不行
17,视图集额外动作,partial
-
目的: 可以添加额外动作,更改指定书籍的阅读量
-
操作流程:
-
1, 子路由
-
url(r'^update_bread/(?P<pk>\d+)/$', views.BookModelViewSet.as_view({'put': 'update_bread'})),
-
-
2,类视图
-
#14,ModelViewSet实现列表,详情视图功能 class BookModelViewSet(ModelViewSet): serializer_class = BookInfoModelSerializer queryset = BookInfo.objects.all() ... #2,修改编号为10的书籍的阅读量为100 def update_bread(self,request,pk): #1,获取书籍 book = self.get_object() data = request.data #2,获取序列化器,校验,入库 serializer = self.get_serializer(instance=book,data=data,partial=True) serializer.is_valid(raise_exception=True) serializer.save() #3,返回响应 return Response(serializer.data,status=status.HTTP_201_CREATED)
-
-
-
注意点:
- 1, partial=True可以进行局部更新