django formview_django queryset合并

django formview_django queryset合并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/166132.html原文链接:https://javaforall.net

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


相关推荐

  • C++ override使用详解

    C++ override使用详解C++override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。   公有继承包含两部分:一是“接口”(interface),二是”实现”

    2025年7月10日
    5
  • http接口取参方式 – getParameter 和 getParameterValues[通俗易懂]

    http接口取参方式 – getParameter 和 getParameterValues[通俗易懂]前言:最近写http接口时,有了很多关于接口取参方式的疑问,大家都知道Servlet常用的取参方式有getParameter、getParameterValues、getInputStream(读流形式)。SpringMvc常用的有封装好的@RequestParam,RequestBody。这些取参方式都有什么特点,我都写了测试接口,利用postman做了测试…

    2022年7月22日
    20
  • android机型适配终极篇_android 10适配

    android机型适配终极篇_android 10适配Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的挑战,这几天我将应用适配到Android7.0,其中也遇到了不少问题也踩了一些坑,在这里就把我在Android7.0适配上的一些心得分享给大家,让大家的应用能早一天跑在Android7.0上。权限更改随着Android版本越来越高,Android对隐私的保护力度也越来越大。从Androi

    2025年9月21日
    5
  • dex文件详解

    dex文件详解1、基本概念能被DVM虚拟机识别,加载并执行的文件格式2、生成dex文件1、通过IDE自动帮我们build生成2、手动通过dx命令去生成dex文件3、在手机上手动运行dex文件3、使用dx命令来生成dex文件首先得要先配置dx环境变量,这个环境变量怎么配呢?找到的sdk的安装目录,然后进入build-tools目录,这里是你电脑上的所有sdk的安装目录,随便选择一个进去,就可以知道dx.b

    2022年6月27日
    62
  • IIC通信协议总结(详细说明完整过程)

    IIC通信协议总结(详细说明完整过程)IIC协议简介IIC(inter-integratedCircuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换。IIC的一个特殊工艺优势是微控制器只需要两个通用I/O引脚和软件即可控制芯片网络。IIC最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100Khz、7-bit标准地址,1992年,IIC的第一个公共规范发行,增加了400Khz的快速模式以及10bit地址扩展。IIC协议IIC协议把传输的消息分为两种类型

    2022年5月2日
    144
  • Java中WebService实例

    Java中WebService实例WebServices是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。WebService的关键技术和规则:1.XML:描述数据的标准方法.2.SOAP:表示信息交换的协议(简单对象访问协议).3.WSDL:Web服务描述语言.4.UDDI:通用描述、发现与集成,他是一种独立于平台,基于XML语言的用于在互联网上描述商务的协议。一、利用JDKweb服务api实现,这里使用基于SOAPmessage的WebService:1.首先创

    2022年7月21日
    10

发表回复

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

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