FireinDark的个人博客

Django-Rest-Framework-04-基于类视图的视图函数

Python

1. 基于类的视图函数(views.py)

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
56
57
58
59
60
61
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
# APIView
from rest_framework.views import APIView
# 返回对象
from rest_framework.response import Response
# 状态码
from rest_framework import status

# 多个对象
class SnippetList(APIView):
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


# 单个对象的部分修改(APIView提供了一些request和response对象)
class SnippetDetail(APIView):
"""
检索,更新或删除一个实例
"""
# 首先获取对象, 发生异常就抛出404页面
def get_object(self, pk):
try:
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404

def get(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet)
return Response(serializer.data)

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

# 重构urls.py
urlpatterns = [
url(r'^snippets/$', views.SnippetList.as_view()),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
]
# 后缀
urlpatterns = format_suffix_patterns(urlpatterns)

2. 基于Mixin类重构视图类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics

class SnippetList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
# 雷打不动,必须的
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

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

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
  • CreateModelMixin: 定义了创建一个序列对象的方法create(self, request, args, *kwargs),保存方法perform_create(self, serializer),成功获取请求头的方法:get_success_headers(self, data)
  • ListModelMixin: 定义了一个获取查询集的方法, many=True:list(self, request, args, *kwargs)
  • RetrieveModelMixin: 定义了一个检索方法,retrieve(self, request, args, *kwargs)
  • UpdateModelMixin: 更新一个模型实例,update(self, request, args, *kwargs)
  • DestroyModelMixin: 删除一个模型实例,方法destroy(self, request, args, *kwargs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics
# 重构单个实例处理方法
class SnippetList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

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

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)

3.复合功能的View类

  1. GenericAPIView:基本的View类,定义了一些常用的方法
  • get_queryset: 获取所有查询集,返回序列器中指定queryset模型的全部对象
  • get_object: 根据传入的查询参数(lookup_url_kwarg or lookup_field)获取查询对象,然后返回, 一般进行联合查询时, 需要重写此方法
  • get_serializer: 获取序列化实例,传入的参数需要通过验证
  • get_serializer_context: 返回序列化的类,api视图中看到的那一大串
  • paginate_queryset: 进行分页,返回分页后的单页结果集
  • get_paginated_response:返回分也好的结果集到前台
  1. CreateAPIView
  2. ListAPIView
  3. RetrieveAPIView
  4. DestroyAPIView
  5. UpdateAPIView
  6. ListCreateAPIView
  7. RetrieveUpdateAPIView
  8. RetrieveDestroyAPIView
  9. RetrieveUpdateDestroyAPIView
加载评论
打赏本文
二维码

9

文章

3

标签

 文章分类