一:继承五大扩展类:
1:序列化返回多个模型类对象:(ListModelMixin)
1.1:ListModelMixin干了什么??

1.2:所以继承之后的代码是:
class BooksView(GenericAPIView, ListModelMixin):
# 定义类属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
# :序列化返回多个模型类对象
def get(self, request):
return self.list(request)
2:序列化新建单一资源:(CreateModelMixin)
2.1:CreateModelMixin做了啥?

2.2:继承后的代码:
class BooksView(GenericAPIView, ListModelMixin, CreateModelMixin):
# 定义类属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
# :序列化返回多个模型类对象
def get(self, request):
return self.list(request)
# 反序列化新建单一资源
def post(self, request):
return self.create(request)
3:反序列化单一资源:(RetriveModelMixin)
3.1:RetriveModelMixin做了什么?

3.2:继承后的代码:
class BookView(GenericAPIView, RetrieveModelMixin):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
lookup_field = "pk"
lookup_url_kwarg = "pk"
# 1:序列化返回单一资源
def get(self, request, pk):
return self.retrieve(request, pk)
4:反序列化更新:(UpdateModelMixin)
4.1:UpdateModelMixin做了什么?

4.2:继承之后的代码:
class BookView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
lookup_field = "pk"
lookup_url_kwarg = "pk"
# 1:序列化返回单一资源
def get(self, request, pk):
return self.retrieve(request, pk)
# 2:反序列化更新(全更新与部分更新)
def put(self, request, pk):
return self.update(request, pk)
def patch(self, request, pk):
return self.partial_update(request, pk)
5:反序列化删除单一资源:(DestroyModelMixin)
5.1:DestroyModelMixin做了什么?

5.2:继承之后的代码:
class BookView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
lookup_field = "pk"
lookup_url_kwarg = "pk"
# 1:序列化返回单一资源
def get(self, request, pk):
return self.retrieve(request, pk)
# 2:反序列化更新(全更新)
def put(self, request, pk):
return self.update(request, pk)
def patch(self, request, pk):
return self.partial_update(request, pk)
# 3:删除单一资源
def delete(self, request, pk):
return self.destroy(request, pk)
此时我们发现,只剩下视图函数,那么与没有不用写视图函数的呢?

二:五大子类:
from books.models import BookInfo
from serializers import BookInfoModelSerializers
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.generics import RetrieveAPIView,UpdateAPIView, DestroyAPIView
class BooksView(ListAPIView, CreateAPIView):
# 定义类属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
class BookView(RetrieveAPIView, ListAPIView, CreateAPIView, UpdateAPIView, DestroyAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
lookup_field = "pk"
lookup_url_kwarg = "pk"
三:视图集ViewSetMixin:
功能:django默认get请求,找get方法,能不能有一种途径,能够让get方法找我们自定义的方法呢?
案例一:
1:定义一个视图:
from rest_framework.viewsets import ViewSetMixin
from books.models import BookInfo
from serializers import BookInfoModelSerializers
class BookView(ViewSetMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
def mylist(self, request, *args, **kwargs):
books = self.get_queryset()
serializer = self.get_serializer(instance=books, many=True)
return Response(data=serializer.data)
2:配置路由:
re_path(r"^books/$", BookView.as_view({"get": "mylist"}))
案例二:ModelViewSet的使用:
modelsViewSet的继承关系:
源码分析:ViewSetMixin:可以自定义的视图集,GenericAPIView是继承于APIview的基类。所以ModelViewSet是我们所有类的子类,继承所有类。


from rest_framework.viewsets import ViewSetMixin, ModelViewSet
from books.models import BookInfo
from serializers import BookInfoModelSerializers
class BookView(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
路由:
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r"^books/$", BookView.as_view({"get": "list", "post": "create"})),
re_path(r"^books/(?P<pk>\d+)/$", BookView.as_view({
"get": "retrieve",
"put": "update",
"patch": "partial_update",
"delete": "destroy",
}))
]
四:ReadOnlyModelViewSet:

五:ViewSet:

六:自定义视图函数:
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from books.models import BookInfo
from serializers import BookInfoModelSerializers
class BookView(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
def latest(self, request, *args, **kwargs):
book = self.queryset.latest('bpub_date')
serializers = self.get_serializer(instance=book)
return Response(data=serializers.data)
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r"^books/$", BookView.as_view({"get": "list", "post": "create"})),
re_path(r"^books/(?P<pk>\d+)/$", BookView.as_view({
"get": "retrieve",
"put": "update",
"patch": "partial_update",
"delete": "destroy",
})),
re_path(r"^books/latest/$", BookView.as_view({"get": "latest"}))
]
浙公网安备 33010602011771号