飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:继承五大扩展类:

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"}))
]
posted on 2020-09-22 19:09  飞行的猪哼哼  阅读(34)  评论(0)    收藏  举报