DRF视图

Posted on   呱呱呱呱叽里呱啦  阅读(16)  评论(0编辑  收藏  举报

DRF视图

请求

# 见源码

响应

# Response()参数:
# data,即要返回的数据,字典格式
# status,返回的状态码
# template_name,即自定义模板
# headers,即响应头,可增加数据
# content_type,即响应编码
# 根据请求的user_agent区别响应,可以配置,如无则使用默认配置


# 局部配置:对某个视图类有效
# 在视图类中先加入:
renderer_classes=[JSONRenderer,]


# 全局配置:对所有视图类都有效
# 在settings.py中加入:
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer']
}

# drf配置信息查找顺序:先视图类,后项目配置文件,最后默认配置

视图

# 视图基类:ModelViewSet(>GenericViewSet)>GenericAPIView>APIView>View

APIView

# 注册rest_framework

# 在models.py中定义表模型
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=6,decimal_places=2)
    author = models.CharField(max_length=32)
    public = models.CharField(max_length=64)

# 在自定义文件中定义序列化器
from rest_framework import serializers


class BooksSerializer(serializers.Serializer):
    name = serializers.CharField()
    price = serializers.DecimalField(max_digits=6,decimal_places=2)
    author = serializers.CharField()
    public = serializers.CharField()

# 在views中定义视图类
class BookView(APIView):
    def get(self,request,id):
        book = Book.objects.filter(id=id).first()
        book_ser = BooksSerializer(book) # 参数就是要序列化的对象
        # book_ser.data就是序列化后的字典
        return Response(book_ser.data) # 也可以用JsonResponse返回,这样不用注册rest_framework,但不能通过判断请求信息区别渲染

# 配置路由信息

GenericAPIView

class BookDetailView(GenericAPIView):
    # queryset = Book.objects.all() # 查询所有
    # serializer_class = BookSerializer # 传入自定义序列器
    # 
    # 之后的内部视图函数就可以使用self.get_queryset()、self.get_object()和self.get_serializer()方法,使用self.get_object(),需要路由配置中有名分组必须命名为pk,或者视图类中配置lookup_url_kwarg属性

# 这种方式是可以将查询或者操作资源需要的query对象或者序列器封装到self.中,在之后创建类似的其他表模型的视图函数只需要复制视图类,修改类名及类名中的queryset、serializer_class参数即可

# 但是这样会造成代码重复,所以可以引入已经写好的5个类:
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
class BookDetailView(GenericAPIView):
    def get(self,request):
        return self.list(request)
    def post(self,request):
        return self.create(request)

GenericAPIView的视图子类9个

from rest_framework.generics import CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView # 继承了GenericAPIView,基于基本5种组合而来
class Book(CreateAPIView,ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
# 以上即所有代码

ModelViewSet(ReadOnlyModelViewSet)

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass
# 继承ModelViewSet创建视图类,多个路由将指向同一个视图类,这时需要指定.as_view()方法中的actions参数,实际上GenericViewSet继承的ViewSetMixin类中重写了.as_view()方法。

源码

# ModelViewSet>GenericViewSet>ViewSetMixin>as_view>view
for method, action in actions.items():
    handler = getattr(self, action)
    setattr(self, method, handler)
# 循环解压路由传来的actions参数,并为视图类对象的相应方法绑定已经写好的方法的内存地址

ViewSetMixin使用

通过源码,我们看到ViewSetMixin中重写的as_view方法非常快乐,所以我们可以在继承APIView、GenericAPIView创建视图类时直接先继承ViewSetMixin来借用

这样可以多个路由指向我们同一个视图类,并且手动配置请求方式和视图类中函数的对应关系

视图类汇总

两个视图基类:APIView、GenericAPIView

五个视图拓展类(直接继承object类):ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin

九个视图子类(继承GenericAPIView和五个视图拓展类中的一个或多个):CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView

五个视图集:GenericViewSet、ModelViewSet、

ReadOnlyModelViewSet、ViewSet、ViewSetMixin

ModelViewSet:五个接口全

GenericViewSet:GenericAPIView+ViewSetMixin

ViewSet:APIView+ViewSetMixin

ViewSetMixin:重写as_view()方法,可以在路由中用actions直接配置请求方式和视图类中具体视图函数的对应关系,手动配置或者使用Router自动配置,当视图类中自定义了视图函数时,可以在视图函数前用@action装饰器,action的参数有methods=[GET,POST]、detail=True,则生成的路由中配置了有名分组pk,需要'/1/get_2'类似的请求,且函数应添加形参pk

(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示