DRF视图组件使用

每个接口都写到独立的类中,然后使用多继承,或者成为mixin的这种方式,就可以对我们的程序进行优化,mixin的方式非常常见,在学网络编程的时候,如果你看过socketserver源码,就会发现,socketserver中就有对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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from rest_framework.views import APIView
# rest_framework响应模块
from rest_framework.response import Response

# 引入书籍模型
from app.models import Book as BookModel
from app.models import Authors as AuthorsModel
from app.api_serialize import BookSerialize

# Books视图类
class Books(APIView):
def get(self, request):
# 读取所有书籍
data = BookModel.objects.all()
# 使用序列化类序列化书籍相关字段,many代表获取的是多条信息
serialize_data = BookSerialize(data, many=True)
# 返回json数据
return Response(serialize_data.data)
def post(self, request):
# 使用序列化模型接收用户提交的数据
verified_data = BookSerialize(data=request.data)
# 验证是否填写
if verified_data.is_valid():
# 保存书籍及对应的作者
book = verified_data.save()
authors = AuthorsModel.objects.filter(pk__in = request.data['authors'])
book.authors.add(*authors)
# 返回添加成功的书籍信息
return Response(verified_data.data)
else:
return Response(verified_data.errors)

# BooksView视图类用来查询单条、修改单条、删除单条书籍
class BooksView(APIView):
def get(self, request, id):
# 查询该条数据
book = BookModel.objects.filter(pk=id).first()
verified_data = BookSerialize(book, many=False)
return Response(verified_data.data)
def put(self, request, id):
# 查询单条书籍
book_obj = BookModel.objects.get(pk = id)
# 实例化模型类接收书籍对象和修改数据
verified_data = BookSerialize(data=request.data, instance=book_obj, many=False)
# 验证数据有效性
if verified_data.is_valid():
# 保存修改包括关联标的修改
verified_data.save()
return Response(verified_data.data)
else:
return Response(verified_data.errors)
def delete(self, request, id):
book_obj = BookModel.objects.filter(pk = id).delete()
return Response('')

视图组件:主要用来优化接口逻辑

  1. 使用视图组件的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
    39
    from 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

  2. 使用视图组件的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

  3. 使用视图组件的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'
    }))