心蓝的博客 心蓝的博客
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

心蓝

人生苦短,我用python
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • 零基础

  • 专项

  • web框架

    • django框架

    • drf

      • 简介
      • 序列化器
      • 请求和响应
      • 类视图
        • 使用基于类的视图重写API
        • 使用使用mixins
        • 使用通用类视图
      • 视图集和路由器
      • 序列化器补充
      • 身份验证与权限
      • 分页与限流
  • python
  • web框架
  • drf
心蓝
2022-12-26
目录

类视图

# 类视图

# 使用基于类的视图重写API

使用基于类的视图重写API

from django.http import  Http404

from rest_framework import status
from rest_framework.decorators import api_view, APIView
from rest_framework.response import Response

from crm.models import Student
from crm.serializers import StudentSerializer


class StudentList(APIView):
    """
    学生列表,创建视图
    """
    def get(self, request, format=None):
        objs = Student.objects.all()
        serializer = StudentSerializer(objs, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = StudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class StudentDetail(APIView):
    """
    查看,更新或者删除一个项目
    """
    def get_object(self, pk):
        try:
            return Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        obj = self.get_object(pk)
        serializer = StudentSerializer(obj)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def put(self, request, pk, format=None):
        obj = self.get_object(pk)
        serializer = StudentSerializer(obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        obj = self.get_object(pk)
        obj.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
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

重构一下路由

urlpatterns = [
    path('students/', views.StudentList.as_view()),
    path('students/<int:pk>', views.StudentDetail.as_view()),
]
1
2
3
4

# 使用使用mixins

使用基于类的视图的一大优点是,它允许我们轻松地组合可重用的行为。

在实际开发过程中,对任何模型的创建/检索/更新/删除操作非常相似。REST framework在mixin类中实现了这些公共行为。

让我们看看如何使用mixin类来组合视图。views.py模块代码如下:

from rest_framework import status, mixins, generics
from rest_framework.decorators import APIView
from rest_framework.response import Response

from crm.models import Student
from crm.serializers import StudentSerializer


class StudentList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    """
    返回所有的项目或者创建一个新项目
    """
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):

        return self.create(request, *args, **kwargs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

上面的代码使用GenericAPIView构建视图,并添加ListModelMixin和CreateModelMixin。

基类提供了核心功能,mixin类提供了.list()和.create()操作。然后显式地将get和post方法绑定到适当的操作。

class StudentDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    """
    查看,更新或者删除一个项目
    """
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

同理,我们再次使用GenericAPIView类来提供核心功能,并在mixins中添加.retrieve()、.update()和.destroy()操作。

# 使用通用类视图

使用mixin类,我们已经重写了视图,代码比以前少了一些,但是我们可以更进一步。上面的代码显然是可以公用的,而REST框架提供了一组已经混合在一起的通用视图,我们可以使用这些视图进一步精简我们的views.py模块。

class StudentList(generics.ListCreateAPIView):
    """
    返回所有的项目或者创建一个新项目
    """
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

  
class StudentDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    查看,更新或者删除一个项目
    """
    queryset = Student.objects.all()
    serializer_class = ProjectSerializer
1
2
3
4
5
6
7
8
9
10
11
12
13
14

是不是更简洁了。

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

#drf
上次更新: 2022/12/26, 16:59:39
请求和响应
视图集和路由器

← 请求和响应 视图集和路由器→

最近更新
01
requests让接口测试如此简单 原创
03-31
02
最简明的python正则教程
03-30
03
pycharm激活码
12-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 心蓝
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式