drf框架serializer之视图优化(代码片段)

xiaogongjin xiaogongjin     2022-12-06     378

关键词:

一、create优化

在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:

from django.http import JsonResponse
from django.views import View
from django.db import connection
import json
from .models import Projects
from .serializers import ProjectSerializer


class ProjectsPage(View):
    ‘‘‘
    类视图
    ‘‘‘
    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse("code": 1, "res": "error", "msg": serializer_check_obj.errors)

        obj = Projects.objects.create(**serializer_check_obj.validated_data)

        serializer_obj = ProjectSerializer(instance=obj)
     return JsonResponse(serializer_obj.data, status=201)

如上我们可以看到,实际上我们创建了两个序列化器类对象,一个serializer_check_obj用于反序列化参数校验(给data传参),一个serializer_obj用于序列化输出(给instance传参),能不能只创建一个序列化器对象就能实现两个对象的功能呢?答案是可以的,我们可以去掉serializer_obj,然后调用serializer_check_obj的save()方法,save()方法会自动调用模型类对象中定义的create方法

    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse("code": 1, "res": "error", "msg": serializer_check_obj.errors)

        serializer_check_obj.save()

        return JsonResponse(serializer_check_obj.validated_data, status=201)

模型类中的create方法需要提前定义,该方法是父类的create方法,我们可以进行重写,父类方法源码如下:

技术图片

 

 在序列化器类中重写父类的create方法,并返回模型类对象

    def create(self, validated_data):
        obj = Projects.objects.create(**validated_data)
        return obj

验证结果:

技术图片

在调用序列化器类对象的save()方法时,也可以传参,传参以关键字的方式传入,它会自动添加到create方法的validated_data中,我们可以根据这个参数去进行一些关联,如判断当前项目已登录,或者当前这个项目判断是哪个用户创建的

二、update优化

原代码如下:

    def put(self, request, pk=None):
        if pk:
            update_data = json.loads(request.body)
            obj = Projects.objects.get(id=pk)

            serializer_check_obj = ProjectSerializer(data=update_data)
            if not serializer_check_obj.is_valid():
                return JsonResponse("code": 1, "res": "error", "msg": serializer_check_obj.errors)

            obj.name = serializer_check_obj.validated_data.get(name) or obj.name
            obj.leader = serializer_check_obj.validated_data.get(leader) or obj.leader
            obj.programmer = serializer_check_obj.validated_data.get(programmer) or obj.programmer
            obj.tester = serializer_check_obj.validated_data.get(tester) or obj.tester
            obj.save()

            serializer_obj = ProjectSerializer(instance=obj)

            return JsonResponse(serializer_obj.data, status=201)

上面创建了两个序列化器类的对象,我们也可以进行合并,合并方式跟create有点差别,这里是给模型类对象同时传入data和instance,然后调用save()方法,它会自动去调用序列化器类中的update方法

优化后的put方法:

    def put(self, request, pk=None):
        if pk:
            update_data = json.loads(request.body)
            obj = Projects.objects.get(id=pk)

            serializer_obj = ProjectSerializer(data=update_data, instance=obj)
            if not serializer_obj.is_valid():
                return JsonResponse("code": 1, "res": "error", "msg": serializer_obj.errors)

            serializer_obj.save()

            return JsonResponse(serializer_obj.data, status=201)

模型类中的update方法需要提前定义,该方法是父类的update方法,我们可以进行重写,父类方法源码如下:

技术图片

  在序列化器类中重写父类的update方法,并返回模型类对象

    def update(self, instance, validated_data):
        # instance为待更新的模型类对象
        # validated_data参数为校验通过之后的数据
        # 必须将更新成功的模型类对象返回
        instance.name = validated_data.get(name) or instance.name
        instance.leader = validated_data.get(leader) or instance.leader
        instance.programmer = validated_data.get(programmer) or instance.programmer
        instance.tester = validated_data.get(tester) or instance.tester
        instance.save()
        return instance

验证结果:

技术图片

drf框架之serializers序列化组件(代码片段)

...学了序列化工具json工具,就是吧信息存为类字典形式2.DRF框架自带序列化的工具:serializers 3.DRF框架serializers分为:第一种Serializer 第二种ModelSerializer 第一种用法之Serializerfromdjango.dbimportmodels#Createyourmod 查看详情

drf框架之视图的扩展类简介(代码片段)

这里呢,我将为大家介绍一下DRF框架,为我们提供的试图扩展类的使用方法即作用。在使用视图扩展类时,需要将mixins模块导入到view文件中。fromrest_frameworkimportmixins并且,在使用视图扩展类时,必须结合GenericAPIView基类一起使用... 查看详情

drf框架之serializer序列化器的序列化操作(代码片段)

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.今天,我们就先来学习一下Serializer序列化器。使用Serializer序列化器的开发步骤:1.定义Serializer序列化器首先,我们要在子应用中,创建见一个serializers.py文件... 查看详情

drf框架之mixins(代码片段)

一、ListModelMixin提供list(request,*args,**kwargs)方法获取已存在的列表数据(获取多条记录)获取成功,则返回200OK1.引入方式fromrest_framework.mixinsimportListModelMixin2.源码对比我们可以发现,两处的代码基本一致,因此我们直接拿到使用来... 查看详情

drf框架之modelserializer序列化器(代码片段)

ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators,比如unique_together包含默认的create()和update()的... 查看详情

drf序列化(代码片段)

1.rest-framework序列化之Serializerrest-framework序列化之Serializer步骤1.创建一个类,继承Serializer2.在类中写要序列化的字段‘‘‘classBookSerializer(serializers.Serializer):#序列化表中的某几个字段固定写法nid=serializers.CharField()name=serializers. 查看详情

drf之视图组件(代码片段)

不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段。相关知识点相关知识点一:RESTfulapi接口规范我给大家总结的REST的最重要的一句话,那就是:url用来唯一定位资源,http请求... 查看详情

django-rest-framework---总结(代码片段)

目录drf回顾总结drf基础1.drf框架安装2.接口3.restful接口规范4.基于restful规范的原生Django接口drf五大模块1.请求模块:request对象2.渲染模块:浏览器和Postman请求结果渲染数据的方式不一样3.解析模块4.异常模块5.响应模块序列化组件... 查看详情

drf视图家族(代码片段)

...继承GenericAPIView时可以保持一致2)GenericAPIView将queryset、serializer_class、lookup_field封装成类属性 3)GenericAPIView给我们提供了三个方法get_queryset、get_serializer、get_objself.get_queryset():获取所有self.get_object():获取根据pk获取单个self.get_... 查看详情

drf视图(代码片段)

...层封装====================="""classGenericAPIView(APIView):queryset=Noneserializer_class=Nonedefget_queryset(self):"""用于获取queryset的方法"""returnself.queryset.all()defget_serializer(self,*args,**kwargs):"""用于调用序列化类的方法"""returnself.serializer_class(*args,**kwargs)c... 查看详情

drf视图组件(代码片段)

目录一视图1.1试图配置1.2视图1.2.12个视图基类1.2.1.1APIView2.2.1.2GenericAPIView[通用视图类]get_serializer(self,args,*kwargs)1.2.25个视图扩展类1)ListModelMixin2)CreateModelMixin3)RetrieveModelMixin4)UpdateModelMixin5)DestroyMode 查看详情

drf之jwt补充(代码片段)

DRF之JWT补充1.JWT控制用户登录后才能反问,匿名用户无法访问classQueryUserView(GenericViewSet,RetrieveModelMixin):"""查询接口"""queryset=User.objects.all()serializer_class=UserSerializerpk=None#thrott 查看详情

drf之序列化组件(代码片段)

1一序列化器-Serializer作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能1.1定... 查看详情

drf之路由系统与视图(代码片段)

手动路由编写#路由fromdjango.conf.urlsimporturlfromapp01.viewsimportUserListViewurlpatterns=[#GET请求查询所有#POST请求增加url(r'^users/$',UserListView.as_view()),url(r'^users.(?P<format>w+)/$',Us 查看详情

restframework(drf)框架初探以及认识serializers序列化器的增删改查(代码片段)

定义DjangoRESTframework(简称DRF)是一个强大灵活的wbapi工具功能完善,可快速开发api平台官网地址https://www.django-rest-framework.org/安装要求pip3installdjango==3.2pip3installdjangorestframework1.0使用drf实现用户的增删改查1.创建app2.定义数 查看详情

drf序列化器之请求响应以及视图(代码片段)

...ttp请求处理drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作。所以在django原有的django.views.View类基础上,drf封装了多个视图子类出来提供给我们使用。DjangoRESTframwork提供的视图的主要作用:控制序列化器的执... 查看详情

drf框架之路由routers(代码片段)

...到路由表中urlpatterns+=router.urls当我们定义好Routers后,DRF框架会使用Routers为我们自动创建好路由信息,但是自定义的action并不会自动创建路由信息。2.为自定义action自动创建路由信息在视图集中,如果想要让Router自动帮助我们为... 查看详情

restframework(drf)框架初探以及认识serializers序列化器的增删改查(代码片段)

定义DjangoRESTframework(简称DRF)是一个强大灵活的wbapi工具功能完善,可快速开发api平台官网地址https://www.django-rest-framework.org/安装要求pip3installdjango==3.2pip3installdjangorestframework1.0使用drf实现用户的增删改查1.创建app2.定义数... 查看详情