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