DRF框架之视图的扩展类简介

这里呢,我将为大家介绍一下DRF框架,为我们提供的试图扩展类的使用方法即作用。

在使用视图扩展类时,需要将mixins模块导入到view文件中。

from rest_framework import mixins

并且,在使用视图扩展类时,必须结合GenericAPIView基类一起使用。

所谓,视图的扩展类,就是GenericAPIView的子类,他们继承自GenericAPIView类,并在此基础上封装了增删改查的功能函数。

模板代码:

class BookInfoAPIView(mixins.视图扩展类, GenericAPIView):
    ‘‘‘使用视图扩展类定义API‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    # 请求方法

1. ListModelMixin扩展类

ListModelMixin扩展类,为我们提供了一个list方法,实现了查询所有信息的功能,并返回JSON数据。

源代码:

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        # 过滤
        queryset = self.filter_queryset(self.get_queryset())
        # 分页
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        # 序列化
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

案例代码:

这里的需求是,查询出所有图书信息。

class BookInfoAPIView(mixins.ListModelMixin, GenericAPIView):
    ‘‘‘使用视图扩展类定义API‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    def get(self, request):

        return self.list(request)

2. CreateModelMixin扩展类

CreateModelMixin扩展类,为我们提供了一个create方法,实现了添加数据的功能,并返回JSON数据。

源代码:

class CreateModelMixin(object):
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        # 获取序列化器
        serializer = self.get_serializer(data=request.data)
        # 验证
        serializer.is_valid(raise_exception=True)
        # 保存
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {‘Location‘: str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}

案例代码:

class BookInfoAPIView(mixins.CreateModelMixin, GenericAPIView):
    ‘‘‘使用视图扩展类定义API
    实现添加图书信息
    ‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    def post(self, request):
        return self.create(request)

3. RetrieveModelMixin扩展类

RetrieveModelMixin扩展类,为我们提供了一个retrieve方法,实现了查询指定数据信息的功能,并响应JSON数据。

源代码:

class RetrieveModelMixin(object):
    """
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        # 获取对象,会检查对象的权限
        instance = self.get_object()
        # 序列化
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

案例代码:

class BookInfoPkView(mixins.RetrieveModelMixin, GenericAPIView):
    ‘‘‘查询指定模型数据‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    def get(self, request, pk):
        return self.retrieve(request)

4. UpdateModelMixin扩展类

UpdateModelMixin扩展类,为我们封装了update方法,实现了更新数据的功能并返回JSON数据。

源代码:

class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop(‘partial‘, False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, ‘_prefetched_objects_cache‘, None):
            # If ‘prefetch_related‘ has been applied to a queryset, we need to
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()

    def partial_update(self, request, *args, **kwargs):
        kwargs[‘partial‘] = True
        return self.update(request, *args, **kwargs)

案例代码:

class BookInfoPkView(mixins.UpdateModelMixin, GenericAPIView):
    ‘‘‘修改指定模型数据‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    def put(self, request, pk):
        return self.update(request)

5. DestroyModelMixin扩展类

DestroyModelMixin扩展类,为我们提供了destroy方法,实现了删除数据的功能并返回JSON数据。

源代码:

class DestroyModelMixin(object):
    """
    Destroy a model instance.
    """
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

案例代码:

class BookInfoPkView(mixins.DestroyModelMixin, GenericAPIView):
    ‘‘‘查询、修改指定模型数据‘‘‘

    # 1. 设置查询集
    queryset = BookInfo.objects.all()

    # 2. 设置序列化器
    serializer_class = BookInfoModelSerializer

    def delete(self, request, pk):
        return self.destroy(request)

以上,便是视图扩展类的简介。

原文地址:https://www.cnblogs.com/chao666/p/12275929.html

时间: 2024-10-11 04:31:08

DRF框架之视图的扩展类简介的相关文章

drf框架 6 视图集与路由组件(开发最常用、最高级) 三大认证原理 RBAC认证规则

准备工作 models.py from django.db import models # 基类:是抽象的(不会完成数据库迁移),目的是提供共有字段的 class BaseModel(models.Model): is_delete = models.BooleanField(default=False) updated_time = models.DateTimeField(auto_now_add=True) class Meta: abstract = True # 必须完成该配置 cla

DRF中五大扩展类及视图集的介绍

五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对数据进行过滤和分页. 源代码: class ListModelMixin(object): """ List a queryset. """ def list(self, request, *args, **kwargs): # 过滤 queryse

DRF框架之视图集(ModelViewSet)简介

DRF框架中,一共有三个视图集类,我们这里只说明ModelViewSet一个. ModelViewSet是封装度最高的DRF的视图类.包含了怎删改查中的所有接口操作. 它继承自GenericViewSet.ListModelMixin.RetrieveModelMixin.CreateModelMixin.UpdateModelMixin.DestoryModelMixin. 所以,在使用ModelViewSet定义API时,我们只需要套用模板即可. 使用视图集,可以将一系列逻辑相关的动作放到一

drf框架, 接口(api) Django FBV => CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源

接口 """ 接口概念:前台与后台进行信息交互的媒介 - url链接 接口组成: url链接 - 长得像返回数据的url链接 请求方式 - get(查).post(增).put(整体改).patch(局部改).delete(删) 请求参数 - 拼接参数.数据包参数(urlencoded.form-data.json) 响应结果 - 响应的json数据 """ 开发阶段接口测试工具 """ Postman: 官网下载.

Django视图扩展类

Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类对应方法即可 . 一.mixins的视图子类 作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量 . 这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用Gen

UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

UIManage单实例: 1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instan

django drf框架中的user验证以及JWT拓展的介绍

登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个拓展比传统的CSRF更加安全.先来介绍一下JWT认证机制吧! Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身

浅析Thinkphp框架中运用phprpc扩展模式

浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc传输的数据流相对于普通WebService中的 XML或JSON形式的数据量明显减少,而且因为数据量的关系解析速度明显比较快~~ 说实话,以前还真不知道有phprpc这个协议的,本打算使用 sina的api的restlet形式开发,但自己写库的话会花比较多的时间,而现在轻量级的php框架支持rest

DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer 第一种用法之 Serializer from django.db import models # Create your models here. class Book(models.Model): nid = mod