关于定义序列化器时,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

原文地址:https://www.cnblogs.com/michealjy/p/12079957.html

时间: 2024-07-30 15:32:52

关于定义序列化器时,read_only和write_only有什么作用的相关文章

Cf序列化器-Serializer解析

Cf序列化器-Serializer 定义序列化器 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer. 例如,我们已有了一个数据库模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = models.DateFiel

16-DRF工程搭建与序列化器

1.DRF工程搭建 环境安装与配置 DRF是以Django扩展应用的方式提供的,所以我们可以直接利用Django环境,而无需创建(先创建Django环境). 1.安装DRF pip3 install djangorestframework 2.添加rest_framework应用 在django工程上的settings.py的INSTALLED_APPS中添加“rest_framework” INSTALLED_APPS = [ ... 'rest_framework', ] 使用Django

drf序列化器serializers.SerializerMethodField()的用法

为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request,如果有,就给图片加上域名, 比如说我们视图用的是apiview(): 我们需要序列化数据的时候,加  context={"request":request} TestSerilaizer(instance=instance, context={"request":request})

DRF序列化器的使用

序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的数据库 先查询出一个学生对象 from students.models import Student student = Student.objects.get(id=3) 构造序列化器对象 from .serializers import StudentSerializer serializer

序列化器反序列化的使用

反序列化原理: Json字符串-->字典-->对象 反序列化的作用: 1.校验参数的准确性 2.校验通过后,可以在数据库中保存或修改数据 反序列化的使用: 首先定义序列化器: class DepartmentSerializer(serializers.Serializer): """部门序列化器类""" id = serializers.IntegerField(read_only=True) name = serializers.

DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤: 1. 定义Serializer序列化器 首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码. from rest_framework import serializers # 定义序列化器 class BookInfoSerializer

NetworkComms c#通信框架之使用BinaryFormatter序列化器进行网络通信

NetworkComms是一款来自英国的C#语言编写的通信框架 NetworkComms通信框架默认使用的是protobuf.net序列化器 NetworkComms 通信框架还内置了 BinaryFormaterSerializer 序列化器,此序列化器是对.net框架自带的  BinaryFormatter 的封装使用. 在networkcomms v2版本中的BinaryFormaterSerializer代码如下: #if WINDOWS_PHONE #else using System

序列化器的理解

其实就是Django RESTful Framework RESTful一种API的命名风格,主要因为前后端分离开发出现 前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到 RESTful风格:数据应该是名词,而动词由HTTP的请求方式来体现 RESTful风格的API给前端返回 结果对象,无论什么请求方式 "' 特点: 反复重复 因为不论什么请求方式,都需要给前端返回对象内容,就是json格式的 所以每次如果有查询的结果对象都需要遍历成字典,和flask相同 如果不是get请求

模型类序列化器

模型类序列化器 DRF提供了模型类序列化器: ModelSerializer 作用: 简化对应django模型类的序列化器的定义 ModelSerializer与常规的Serializer相同,但提供了: 基于模型类自动生成一系列字段 基于模型类自动为 Serializer 生成 validators,比如字段唯一的校验器 包含默认的 create() 和 update() 的实现 1. 定义 比如我们创建一个 DepartmentSerializer2 class DepartmentSeri