Django(52)APIView详解[通俗易懂]

Django(52)APIView详解[通俗易懂]APIView视图类在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

APIView视图类

DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

关于视图的逻辑,一共有10个

  • 单查、群查
  • 单增、群增
  • 单删、群删
  • 单全局改、单局部改
  • 群全局改、群局部改(这2个用的非常少)
     

单查、群查操作

注意:如果我们做的删除操作是逻辑删除,单查群查的时候,需要先过滤数据,比如过滤掉被删除的,再返回给前台

class Students(APIView):
    def get_object(self, pk):
        try:
            return Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            raise Http404

    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        # 有pk代表单查
        if pk:
            student = self.get_object(pk)
            serializer = StudentModelSerializer(student)
            return Response({
                "status": 0,
                "message": "成功",
                "results": serializer.data
            })
        # 没有pk代表群查
        else:
            queryset = Student.objects.all()
            serializer = StudentModelSerializer(instance=queryset, many=True)
            return Response({
                "status": 0,
                "message": "成功",
                "results": serializer.data
            })

 

单增、群增操作

注意:单增操作的时候,看需求新增的是否是唯一的,如果是唯一,则需要判断数据已存在

def post(self, request, *args, **kwargs):
    request_data = request.data
    # 单增
    if isinstance(request_data, dict):
        many = False
    # 群增
    elif isinstance(request_data, list):
        many = True
    else:
        return Response({
            "status": 1,
            "message": "数据有误",
        })
    serializer = StudentModelSerializer(data=request_data, many=many)
    if serializer.is_valid():
        serializer.save()
        return Response({
            "status": 0,
            "message": "成功",
            "results": serializer.data
        })
    return Response(serializer.errors, status=400)

 

单删、群删操作

注意:单删的时候,需要判断数据是否已经被删除

def delete(self, request, *args, **kwargs):
    # 单删
    pk = kwargs.get("pk")
    if pk:
        pks = [pk]
    # 群删
    else:
        pks = request.data.get('pks')
    queryset = Student.objects.filter(pk__in=pks)
    if queryset:
        queryset.delete()
        return Response({
            "status": 0,
            "message": "删除成功",
        })
    else:
        return Response({
            "status": 1,
            "message": "删除失败",
        })

 

单局部改

单局部改instance=要被更新的对象,data=要更新的数据,partial=True,必填的字段都变为选填字段

def patch(self, request, *args, **kwargs):
    # 单局部改
    pk = kwargs.get('pk')
    if pk:
        instance = Student.objects.filter(pk=pk).first()
        serializer = StudentModelSerializer(instance=instance, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({
                "status": 0,
                "message": "成功",
                "results": serializer.data
            })
    else:
        return Response({
            "status": 1,
            "message": "失败",
        })

 

单整体改

单整体改则将partial=Falsepartial默认为False

def put(self, request, *args, **kwargs):
    # 单整体改
    pk = kwargs.get('pk')
    if pk:
        instance = Student.objects.filter(pk=pk).first()
        serializer = StudentModelSerializer(instance=instance, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({
                "status": 0,
                "message": "成功",
                "results": serializer.data
            })
    else:
        return Response({
            "status": 1,
            "message": "失败",
        })

 

总结

APIView视图类就是做增删改查的操作,当然APIView中还继承了一些常用的属性,比如authentication_classespermission_classesthrottle_classes等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164889.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QVBoxLayout的使用

    QVBoxLayout的使用#include<QApplication>#include<QPushButton>#include<QWidget>#include<QMenuBar>#include<QStatusBar>#include<QVBoxLayout>#include<QTextEdit>#include&amp

    2022年6月17日
    38
  • python常见运维脚本_Python运维常用脚本[通俗易懂]

    python常见运维脚本_Python运维常用脚本[通俗易懂]一、清除指定redis缓存#!/usr/bin/envpython3importredis#选择连接的数据库db=input(‘输入数据库:’)r=redis.Redis(host=‘127.0.0.1’,port=6379,db=0)#输入要匹配的键名id=input(‘请输入要执匹配的字段:’)arg=‘’+id+’’n=r.keys(arg)#查看匹配到键值f…

    2022年7月12日
    17
  • Java自学视频整理(持续更新中…)

    Java自学视频整理(持续更新中…)1.Java基础视频 《张孝祥JAVA视频教程》完整版[RMVB](东西网)历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播客)张孝祥2010年贺岁视频:Java高新技术(传智播客)Java多线程与并发库高级应用(传智播客)尚学堂JAVA视频下载大全(持续更新中…请关注!)(尚学堂)《动力节点,王勇JAVA系列视频教程》(东西网)张孝祥Java高新技术

    2022年7月8日
    23
  • Vue图片加载错误、图片加载失败的处理

    Vue图片加载错误、图片加载失败的处理比如后台返回的一个图片字段pic,我们通常在代码里,会做一个检验图片,通常会像下面这样写<img:src=”pic?pic:’../../assets/img/load.png'”alt=””>这个判断只能判断pic是否存在,只有pic=”的情况下,才回显示设置的默认图片,但是如果pic这个字段是有值的呢,并且是一个错误的值,或者一个找不到的404的图片呢?这个时候就要…

    2022年6月2日
    150
  • java四舍五入成整数的方法

    java四舍五入成整数的方法    在java的Math类中,提供了许许多多的和数学计算有关的方法,其中也包括取整的,关于取整的有向下取整的floor(doubled)返回值double,rint(doubled),round(doubled)和round(floatf)。   但是,其中和四舍五入相近的方法只有rint和round方法,如果单独使用这两个方法的话,所得到的结果和我们预期的结果不一样,    比如r…

    2022年5月21日
    229
  • 万方数据知识平台 TFHpple +Xpath解析[通俗易懂]

    万方数据知识平台 TFHpple +Xpath解析

    2022年1月23日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号