• 关于定义序列化器时,read_only和write_only有什么作用


    关于序列化和反序列化

    在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了

    • 序列化就是将对象转化方便传输和存储字节序列,例如json.dumps就是序列化(狭义的序列化,将字典转化为json字符串),这样得到的json字符串不仅直接可以在其他语言使用(跨平台比较好),而且可以在前后端进行传输交互(drf序列化器)

    • 反序列化恰恰相反,而是将字节序列转化为对象,json.loads是将json字符串转化为字典,是狭义的反序列化(因为在python, 一切皆对象,字典是dict( )),而在项目中,前端传过来的序列化数据通过反序列化得到对象,进一步可以通过ORM操作,存入数据库。

    关于read_only和write_only(在drf序列化器定义字段时使用)

    之所以会有read_only和write_only的疑问,主要和序列化与反序列化有关,所以我会从这两个角度来分析

    • read_only 是只读,不能写(可以理解为只能从后台到前台,后台操作后直接传前台),就是不能对字段进行修改操作(也就是不和数据库进行交互),用在序列化字段里。下面的例子中,gender只用于传到前端展示。而不用于存到数据库
    #model.py
    class User(models.Model):
    	sex=CharField(
            choices=((0, ‘男’), (1,‘女’))
        )
        #自定义序列化
        @property
        def gender(self):
            return self.get_sex_diaplay()
        
        
    #serializer.py
    
    class UserModelSerializer(ModelSerializer):
        class Meta;
        	model = models.User
            fields = ('gender')
            extra_kwargs = {
                'gender': {
                    'read_only':True,
                },
            }
    
    
    '''
    gender字段只用于把 sex中选项对应的汉字传到前端展示,不与数据库进行交互,而存到数据库的是sex的数字
    '''
    
    • write_only是只写不能读,可以理解为只能前台到后台,在后台做了逻辑操作后直接存数据库,在反序列化字段使用。在下面的例子中,password就是反序列化,不需要传前台,而re_password是自定义反序列化字段,仅用作后台和密码进行比较,然后把结果返回前台,所以不存到数据库,在全局钩子使用时要pop掉
    #model.py
    class User(model.Model):
        pwd = models.CharField()
        
    #serializers.py
    class UserModelSerializer(ModelSerializer):
        re_pwd = serializers.CharField(min_length=3, max_length=64, write_only=True) #自定义反序列化字段,一定是write_only=True
        class Meta:
            model = models.User
            fields = ['pwd', 're_pwd']
            extra_kwargs = {
                'pwd': {
                    'write_only': True
                }
            }
        def validate(self, attrs):
            pwd = attrs.get('pwd')
            re_pwd = attrs.pop('re_pwd')
            if pwd != re_pwd:
                raise serializers.ValidationError({'re_pwd': '两次密码不一致'})
            return attrs
    
  • 相关阅读:
    PHP chr函数 对应的AscII码
    微信小程序:样式,事件
    PHP 实现移动端极光推送(转)
    微信小程序服务器请求和上传数据,上传图片并展示,提交表单完整实例代码附效果图(转)
    大头照上传预览,并操作数据库和删除文件夹中存储的之前的图片;$_SERVER['DOCUMENT_ROOT']上传图片和删除图片的时候不要用绝对路径,可以用这个路径
    thinkphp 条件搜索分页(tp自带Page类)
    asp搭配环境
    html5手机端手指滑动选项卡滚动切换效果(转)
    tp框架实现ajax注册验证
    tp框架链接数据库的基本操作
  • 原文地址:https://www.cnblogs.com/michealjy/p/12079957.html
Copyright © 2020-2023  润新知