1. 两个基本视图集
1.1 ViewSet
继承自APIView,作用也与APIView基本类似。在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(ViewSet):
# detail为False 表示不需要处理具体的BookInfo对象
@action(methods=['get'], detail=False)
def latest(self, request):
"""
返回最新的图书信息
"""
book = BookInfo.objects.latest('id')
ser = BookSerialzier(book)
return Response(ser.data)
# detail为True,表示要处理具体与pk主键对应的BookInfo对象
@action(methods=['put'], detail=True)
def read(self, request, pk):
"""
修改图书的阅读量数据
"""
try:
book = BookInfo.objects.get(id=pk)
except:
return JsonResponse({'error': '错误信息'}, status=400)
book.bread = request.data.get('read')
book.save()
ser = BookSerialzier(book)
return Response(serializer.data)
url的定义:
urlpatterns = [
url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
]
1.2 GenericViewset
继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
class Books(GenericViewSet):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerialzier # 指定当前类视图使用的序列化器
def list(self, request):
# 1、查询所有图书对象
books =self.get_queryset()
ser = self.get_serializer(books,many=True)
return Response(ser.data)
def create(self, request):
# 1、获取前端数据
# data = request.body.decode()
# data_dict = json.loads(data)
data = request.data
# 2、验证数据
ser = self.get_serializer(data=data)
ser.is_valid() # 验证方法
# 3、保存数据
ser.save()
# 4、返回结果
return Response(ser.data)
1.3 两个拓展视图集
1.3.1 ModelViewSet
继承自GenericAPIVIew,同时还继承了5个拓展类:ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
1.3.2 ReadOnlyModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。
2. 使用视图集类
- 导包:
**from rest_framework import viewsets**
,viewsets是一个文件,里面含有以上介绍的视图集类。 - 类视图继承视图集ViewSet后,不再实现get(),post()等方法,而是实现以下五个动作:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
- 类视图虽然实现了以上5个动作,但是需要在路由匹配的时候告诉Django使用类视图中的那个方法来处理接收到的请求。 ```python from rest_framework.viewsets import ViewSet
class UserSet(ViewSet): def list(self, request): … def retrieve(self, request, pk=None): …
```python
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]
- action属性:在视图集中,通过action对象属性来获取当前请求视图集时的action动作是哪个。
使用action装饰器自定义方法:
添加自定义动作需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:methods:该action支持的请求方式,列表传递
- detail:表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)