- 哪五大拓展类视图?详见之前文章:拓展类视图
继承原因:
继承五大拓展类视图,可以获得各自封装好的序列化和反序列化操作的方法,return
返回的时候调用方法即可实现增删改查操作。 - 获取列表资源
list(request)
- 新建单一资源
self.create(request)
- 获取单一资源
self.retrieve(request, pk)
- 全更新单一资源
self.update(request, pk)
- 部分更新单一资源
self.partial_update(request, pk)
- 删除单一资源
self.destroy(request, pk)
- 比如:源码里封装好的
list()
方法
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from .serializers import *
from books_test.models import *
class BooksView(ListModelMixin, CreateModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
# 1、获取列表资源 —— 序列化返回多个模型类对象
def get(self, request):
return self.list(request)
# 2、新建单一资源 —— 反序列化新建单一模型类对象
def post(self, request,):
return self.create(request)
class BookView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
# 3、获取单一资源 —— 序列化返回单一模型类对象
def get(self, request, pk):
return self.retrieve(request, pk)
# 4、更新单一资源 —— 反序列化更新单一模型类对象
# 4.1全更新
def put(self, request, pk):
return self.update(request, pk)
# 4.2部分更新
def patch(self, request, pk):
return self.partial_update(request, pk)
# 5、删除单一资源 —— 反序列化删除单一模型类对象
def delete(self, request, pk):
return self.destroy(request, pk)
from django.contrib import admin
from django.urls import path,re_path
from books_test.views import *
urlpatterns = [
path('admin/', admin.site.urls),
# 获取多个对象
re_path(r'^books/$', BooksView.as_view()),
# 获取单一资源:GET + /books/(?P<pk>\d+)/ = self.get
re_path(r'^books/(?P<pk>\d+)/$', BooksView.as_view()),
]