Django REST framework 学习笔记(三)
使用mixins和generics
mixins
是一个基于类的API视图generics
用来创建API视图- 使用基于类的API视图最大的好处是我们可以编写可重复使用的方法
- 这次我们使用
mixins
类进行编写API的增删查改功能 - 我们将使用
mixins
实现用更加简洁的代码来编写 - 接下来的操作都是在前面项目的基础上
- 编写
views.py
文件
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)
class SnippetDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
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)
- 我们使用了
GenericAPIView
来创建API视图,并且添加上mixins
类提供的ListModelMixin
,CreateModelMixin
,
以及RetrieveModelMixin
,UpdateModelMixin
,DestroyModelMixin
mixins
类提供了.list()
,.create()
,.retrieve()
,.update()
,.destroy()
操作
分别对应get
,post
,get
,put
,delete
方法
mixins | 操作 | 请求方法 | 响应 |
---|
ListModelMixin | .list() | get | 获取所有实例 |
CreateModelMixin | .create() | post | 增加实例 |
RetrieveModelMixin | .retrieve() | get | 获取单个实例 |
UpdateModelMixin | .update() | put | 修改实例 |
DestroyModelMixin | .destroy() | delete | 删除实例 |
generics
类还有更加简洁的写法,使得我们的代码更加干净,节省更多的时间- 即将
ListModelMixin
,CreateModelMixin
,GenericAPIView
合并到一起变为ListCreateAPIView
- 将
RetrieveModelMixin
,UpdateModelMixin
,DestroyModelMixin
,GenericAPIView
合并到一起变为RetrieveUpdateDestroyAPIView
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer