DRF - 视图

GenericAPIView:

源码:

class GenericAPIView(views.APIView):
    queryset = None
    serializer_class = None

    lookup_field = 'pk'
    lookup_url_kwarg = None

    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS

    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    def get_queryset(self)

    def get_object(self)

    def get_serializer(self, *args, **kwargs)

    def get_serializer_class(self)

    def get_serializer_context(self)

    def filter_queryset(self, queryset)

    @property
    def paginator(self)

    def paginate_queryset(self, queryset)

    def get_paginated_response(self, data)

rest framework 的 APIView 是继承 Django 的 view,而 GenericAPIView 是继承 APIView

views.py:

from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.pagination import PageNumberPagination
from drf import models
from rest_framework.response import Response


class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = "__all__"


class TestView(GenericAPIView):
    # 看源码
    queryset = models.Role.objects.all()  # 数据
    serializer_class = PagerSerializer  # 序列化
    pagination_class = PageNumberPagination  # 分页

    def get(self, request, *args, **kwargs):
        # 获取数据
        roles = self.get_queryset()
        # 分页
        role_page = self.paginate_queryset(roles)
        # 序列化
        ser = self.get_serializer(instance=role_page, many=True)
        return Response(ser.data)

运行结果:

 

GenericViewSet:

源码:

它继承了 ViewSetMixin 和 GenericAPIView

urls.py:

from django.urls import path, re_path
from drf import views

urlpatterns = [
    re_path('view/$', views.TestView.as_view({"get": "list"})),
]

TestView 中写的就不是 get 函数,而是 list 的函数,即 get 请求的时候执行 TestView 中的 list 函数

from rest_framework.viewsets import GenericViewSet
from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination
from drf import models
from rest_framework.response import Response


class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = "__all__"


class TestView(GenericViewSet):
    # 看源码
    queryset = models.Role.objects.all()  # 数据
    serializer_class = PagerSerializer  # 序列化
    pagination_class = PageNumberPagination  # 分页

    def list(self, request, *args, **kwargs):
        # 获取数据
        roles = self.get_queryset()
        # 分页
        role_page = self.paginate_queryset(roles)
        # 序列化
        ser = self.get_serializer(instance=role_page, many=True)
        return Response(ser.data)

运行结果:

 

ModelViewSet:

源码:

CreateModelMixin:创建数据,其中有 create 方法

RetrieveModelMixin:显示单条数据,其中有 retrieve 方法

UpdateModelMixin:更新数据,其中有 update、partial_update 方法

DestroyModelMixin:删除数据,其中有 destroy 方法

ListModelMixin:列表显示数据,其中有 list 方法

RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin 需要指定 id 值,而 CreateModelMixin、ListModelMixin 不需要指定 id 值

urls.py:

from django.urls import path, re_path
from drf import views

urlpatterns = [
    re_path('view/(?P<pk>\d+)/$', views.TestView.as_view({
        "get": "retrieve",
        "delete": "destroy",
        "put": "update",
        "patch": "partial_update",
    })),
]

views.py:

from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination
from drf import models


class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = "__all__"


class TestView(ModelViewSet):
    queryset = models.Role.objects.all()  # 数据
    serializer_class = PagerSerializer  # 序列化
    pagination_class = PageNumberPagination  # 分页

运行结果:

显示单条数据,也可以进行删除

也可以添加数据

也可以使用多继承来继承某几个视图

多继承:

urls.py:

from django.urls import path, re_path
from drf import views

urlpatterns = [
    path('view/', views.TestView.as_view({"get": "list", "post": "create"})),
]

views.py:

from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.viewsets import GenericViewSet
from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination
from drf import models


class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = "__all__"


class TestView(ListModelMixin, CreateModelMixin, GenericViewSet):
    queryset = models.Role.objects.all()  # 数据
    serializer_class = PagerSerializer  # 序列化
    pagination_class = PageNumberPagination  # 分页

  

posted @ 2021-01-20 18:52  Sch01aR#  阅读(177)  评论(0编辑  收藏  举报