首页 > 其他分享 >drf : 模型类序列化器 以及扩展用法。

drf : 模型类序列化器 以及扩展用法。

时间:2024-03-25 11:02:12浏览次数:27  
标签:ser serializers name 用法 only 序列化 True drf

模型类序列化器:serializer 的升级。

注意,此时表模型自身的校验规则也将映射过来。

只需要在serializers中写一个模型类序列化器即可。

serializer.py

# 模型类序列化器
# 此序列化类和表模型有对应关系,映射
class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        # 序列化指定字段名
        fields = ['id','name']
        # 全部序列化
        # filter = '__all__'
        # 显示出id以外的
        exclude = ['id']

view.py

# 模型类序列化器
class PublishAPIView(APIView):
    # 查询所有的接口
    def get(self, request, *args, **kwargs):
        # 从数据库中把所有的数据取出,取出Books所有的queryset对象
        publish_list = Publish.objects.all()
        """
        类实例化得到对象(ser),并转为字典,此处为序列化过程,把queryset转成字典
        BookSerializers(
                        需要序列化的queryset对象,
                        data=None可以不传,
                        如果序列化多条数据需要加many=True)
        """
        ser = PublishModelSerializer(instance=publish_list, many=True)
        # ser.data 序列化转成字典
        return Response(ser.data)

    # 新增
    def post(self, request, *args, **kwargs):
        # <rest_framework.request.Request: POST '/books/'>
        # print(request)
        # {'name': '新增8', 'price': 10, 'publish': '测试出版社'}
        # print(request.data)
        ser = PublishSerializers(data=request.data)
        # 校验通过保存数据
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        # 校验未通过
        else:
            # {'name': [ErrorDetail(string='不能以sb开头', code='invalid')]}
            # print(ser.errors)
            # [ErrorDetail(string='不能以sb开头', code='invalid')]
            print(ser.errors.get('name'))
            return Response({'msg': '出错'})

还可以写模型类的方法:

depth深度查询

没有使用depth深度查询。

使用depth深度查询


但是无法限制获取到深度查询字段。

模型类序列化器之重写字段


注:使用serializers.ModelSerializer,内部重写了create和updata方法。不用再手动重写这两个方法。

局部钩子和全局钩子与数据的验证一致。

read_only 和 write_only

反序列化 write_only


序列化 read_only

进阶用法


最终用法:extra_kwargs,额外给字段传递参数。

class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
        #  反序列化
        # name = serializers.CharField(write_only=True)
        extra_kwargs = {'name':{'write_only':True,'max_length':8}}

    name_detail = serializers.SerializerMethodField(read_only=True)
    def get_name_detail(self,obj):
        print(obj)
        return "反序列化" + obj.name
    # # 反序列化
    # name = serializers.CharField(write_only=True)

上述总结:

1.继承ModelSerializer

2.字段是通过表模型映射过来。
	class Meta:
    model=Publish # 表模型
    fields='__all__' # 序列化字段
    # exclude=['id'] 排除指定字段
    # depth 深度,一般不用
    
3.可以重写字段,不重写字段则使用表型字段以及关系
    name = serializers.SerializerMethodField()
    get_name_str = serializers.CharField(source='get_name')
    def get_name(self,obj):
        return f'注明出版社: {obj.name}'
      
4.可以扩写字段(表模型中没有字段)
5.反序列化是,字段自己的校验规则,映射了表模型的
6.局部钩子和全局钩子完全一样。 

7.read_only 和 write_only
# 反序列化使用
# name = serializers.CharField(write_only=True)

# 序列化使用
# name = serializers.CharField(read_only=True)

8.extra_kwargs
# 额外给字段传递参数
# name = serializers.CharField(write_only=True)
extra_kwargs = {'name':{'write_only':True,'max_length':8}}

标签:ser,serializers,name,用法,only,序列化,True,drf
From: https://www.cnblogs.com/HeroZhang/p/18093942

相关文章

  • drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(va
    source,SerializerMethodField,局部钩子,全局钩子serialzer.py:source用处对应字段:起别名,用处2对应方法:在表模型中定义一个方法,source可以与其关联用处3对应方法:可以当做字段第三种方法的扩展用法:使用程度高。model.pyfromdjango.dbimportmodels#Createyourmo......
  • drf : APIView执行流程和新的Request源码。APIView和Request对象分析
    DRF基本使用及执行流程分析1.继承APIView使用2.APIView的执行流程路由:path('Book1',view.Book.as_view())-->第二个参数是函数的内存地址-->APIView的as_view的执行结果-->本质还是用了View类的as_viewn内的viewc包函数,去掉了csrf的认证。-->当请求来......
  • drf: 序列化和反序列化, Django Rest_Framework 介绍也安装及使用。
    序列化与返序列化序列化:将python中的数据类型转换成指定数据类型发送给别人返序列化:接收别人发送过来的数据,返序列化成我们所需要的格式。eg::前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。DjangoR......
  • drf : web应用模式,RESTful API规范,接口测试工具:Postman
    drf:web应用模式,RESTfulAPI规范,接口测试工具:PostmanWeb应用模式前后端不分离前后端分离API接口前后端交互的媒介WebAPI接口和一般的url链接还是有区别的,WebAPI接口简单概括有下面四大特点。url:长得像返回数据的url链接https://api.map.baidu.com/place/v2/search......
  • JavaScript:void(0) 用法及常见问题解析
    JavaScript:void(0)用法及常见问题解析javascript:void(0);是一种在JavaScript和网页开发中经常使用的技术,尤其在处理链接的行为时。本文将深入探讨javascript:void(0);的用法,以及在使用过程中可能遇到的常见问题和解决方法。什么是javascript:void(0);?javascript:v......
  • echo cat 用法
     echo"123456">>0.txtcat0.txt"123456"catfilename|tail-n+500|head-n100//打印部分行echo"123456"|tee-a0.txtprintf"123456">>0.txt//和echo功能相同,并提供更多的格式  touchtest.txtecho1......
  • Java序列化之Jackson详解
    目录1Jackson1.1Jackson简介1.2为什么选择Jackson1.3Jackson的基本功能1.3.1将Java对象转换为JSON字符串(序列化)1.3.2将JSON字符串转换为Java对象(反序列化)1.4Jackson库主要方法1.5使用Jackson基本步骤1.5.1添加依赖(Maven或Gradle)1.5.2创建Java对象模型1.5.3使用ObjectMa......
  • function函数和箭头函数的区别,用法和功能方面的区别
    在JavaScript中,普通函数(functionfunctions)和箭头函数(arrowfunctions)有一些区别,包括用法和功能方面的不同之处:语法:普通函数使用关键字 function 来声明函数,例如:functionmyFunction(){...}。箭头函数使用箭头 => 来声明函数,例如:constmyFunction=()=>{...}......
  • Shiro反序列化分析
    前言Shiro,一个流行的web框架,养活了一大批web狗,现在来对它分析分析。Shiro的gadget是CB链,其实是CC4改过来的,因为Shiro框架是自带Commoncollections的,除此之外还带了一个包叫做CommonBeanUtils,主要利用类就在这个包里环境搭建https://codeload.github.com/apache/shiro/zip/shiro......
  • Apache ECharts的用法——通过直观的图表来展示数据
    定义ApacheECharts是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。官网地址:https://echarts.apache.org/zh/index.html为了通过直观的图表来展示数据入门案例ApacheEcharts官方提供的快速入门:点击跳转网盘下载下载链......