DRF视图组件使用
每个接口都写到独立的类中,然后使用多继承,或者成为mixin的这种方式,就可以对我们的程序进行优化,mixin的方式非常常见,在学网络编程的时候,如果你看过socketserver源码,就会发现,socketserver中就有对mixin的实现,即,假设我们需要进程的时候,我们继承进程类,如果我们需要线程的时候,我们继承线程类即可
所有使用视图组件代码如下,代码中已经很详细标了注释,故不再一一解释
未使用视图组件的接口代码
1 | from rest_framework.views import APIView |
视图组件:主要用来优化接口逻辑
使用视图组件的mixin进行接口优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39from rest_framework.mixins import(
ListModelMixin,
CreateModelMixin,
DestoryModelMixin,
UpdateModelMixin,
RetrieveModelMixin
)
from rest_framework.generics import GenericAPIView
# 引入自定义序列化类
from app_serializer import BookSerializer
class Books(ListModelMixin, CreateModelMixin, GenericAPIView):
# 设置queryset
queryset = BookModel.objects.all()
# 设置自定义序列化类
serializer_class = BookSerialize
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# BooksView视图类用来查询单条、修改单条、删除单条书籍
class BooksView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = BookModel.objects.all()
serializer_class = BookSerialize
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)注意:如果使用默认的mixin,BooksView视图类对应的路由配置参数名必须为pk,即:
1
path('books/<int:pk>', BooksView.as_view())
另外:使用post和put时,header请求头中Content-type必须是:application/json,使用postman测试时也要配置content-type
使用视图组件的view进行接口逻辑优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 使用视图组件view继续优化接口
from rest_framework import generics
# 引入书籍模型
from app.models import Book as BookModel
# 引入自定义序列化类
from app.api_serialize import BookSerialize
# Books视图类,查询列表、创建
class Books(generics.ListCreateAPIView):
# 设置queryset
queryset = BookModel.objects.all()
# 设置自定义序列化类
serializer_class = BookSerialize
# BooksView视图类用来查询单条、修改单条、删除单条书籍
class BooksView(generics.RetrieveUpdateDestroyAPIView):
queryset = BookModel.objects.all()
serializer_class = BookSerialize使用视图组件的viewset进行接口逻辑优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# views.py视图文件
# 使用视图组件viewset继续优化接口
from rest_framework.viewsets import ModelViewSet
# 引入书籍模型
from app.models import Book as BookModel
# 引入自定义序列化类
from app.api_serialize import BookSerialize
# Books视图类,查询列表、创建
class Books(ModelViewSet):
# 设置queryset
queryset = BookModel.objects.all()
# 设置自定义序列化类
serializer_class = BookSerialize
# urls.py路由文件
# 使用viewset组件定义url路由
path('books', Books.as_view({
'get':'list',
'post':'create'
})),
path('books/<int:pk>', Books.as_view({
'get':'retrieve',
'put':'update',
'delete':'destroy'
}))