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 # 分页

浙公网安备 33010602011771号