反序列化(不推荐版):
两个字段 一个为正序准备,一个为反序准备
重写create update方法

1. 确定数据结构: 自己定义key
book_obj = {
"title": "语文sadasd",
"pub_time": "2018-11-14",
"post_category": 2,
"publisher_id": 1,
"authors_list": [1, 2]
} 2. 序列化器: 注意外键,多对多,多选需要反序列化,其余不用
正序和反序列化字段不统一: 1. 注意id 只序列化不走校验(required=False)
id = serializers.IntegerField(required=False) 2. 注意选择
# 正序用
category = serializers.CharField(source="get_category_display", read_only=True)
# 只能反序用 新增分类
post_category = serializers.IntegerField(write_only=True) 3. 注意外键
publisher = PublisherSerializer(read_only=True)
publisher_id = serializers.IntegerField(write_only=True) 4. 注意多对多
authors = AuthorSerializer(many=True, read_only=True)
authors_list = serializers.ListField(write_only=True) 4. 重写create方法
def create(self, validated_data):
book_obj = Book.objects.create(
title=validated_data["title"],
pub_time=validated_data["pub_time"],
category=validated_data["post_category"],
publisher_id=validated_data["publisher_id"])
book_obj.authors.add(*validated_data["authors_list"])
return book_obj 3. 验证通过返回ser_obj.validated_data
4. 验证不通过返回ser_obj.errors

字段校验: 权重: 自定义>单个>多个

# 自定义验证函数,需要加在类的前面, 然后哪个字段需要校验,哪个字段中添加 validators=[my_validate]
def my_validate(value):
if "敏感信息" in value.lower():
raise serializers.ValidationError("❌有敏感词汇")
return value # 单个字段校验
def validate_title(self,value):
# value就是title的值,对value处理
if "python" not in value.lower():
raise serializers.ValidationError("标题必须含有python")
return value # 多个字段校验
def validate(self, attrs):
# attrs 字段有全部传过来的所有字段
if "xxx" in attrs['title'].lower() or attrs['post_category']==1:
raise serializers.ValidationError('出错了')
return attrs

ModelSerializer:

关联哪个字段,获取到哪个字段的全部信息
外键关系还是k为数字
需要重写正序字段

class BookSerializer(serializers.ModelSerializer):
# 自定制 重写字段 需要重写正序,反序用默认
category_display = serializers.SerializerMethodField(read_only=True)
publisher_info = serializers.SerializerMethodField(read_only=True)
authors_info = serializers.SerializerMethodField(read_only=True) # 钩子函数显示外键信息 obj:每次序列化的模型对象
def get_category_display(self, obj):
# obj是序列化的每个Book对象
return obj.get_category_display() # 自定义要返回的内容 def get_publisher_info(self, obj):
publisher_obj = obj.publisher
return {'id': publisher_obj.id, 'title': publisher_obj.title} def get_authors_info(self, obj):
authors_queryset = obj.authors.all()
return [{"id": author.id, "name": author.name} for author in authors_queryset] class Meta:
model = Book 表名字
fields = '__all__'
# depth = 1 # 所有字段都拿出来一般不用, 会让所有的外间关系变成read_only = Trur
extra_kwargs = {
            'publisher': {'write_only': True},
'authors': {'write_only': True},
}
       # extra_kwargs={"默认的字段名称":{自定义的参数配置信息}}

DRF序列化/反序列化的更多相关文章

  1. drf序列化器与反序列化

    什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...

  2. drf序列化及反序列化

    假如把drf看做一个汉堡包,我们之前讲的模块属于汉堡包前面的盖盖(请求模块.渲染模块)和底底(异常模块.解析模块.响应模块),但是真正中间的夹心没有讲,那么今天我就和大家来看一下汉堡包的夹心(序列化及 ...

  3. drf序列化和反序列化

    目录 drf序列化和反序列化 一.自定义序列化 1.1 设置国际化 二.通过视图类的序列化和反序列化 三.ModelSerializer类实现序列化和反序列化 drf序列化和反序列化 一.自定义序列化 ...

  4. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...

  5. Django的DRF序列化方法

    安装rest_framework -- pip install djangorestframework -- 注册rest_framework序列化 -- Python--json -- 第一版 用v ...

  6. drf序列化器的实例

    应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...

  7. 【DRF序列化】

    目录 基本的序列化操作 外键/多对多关系的序列化 反序列化的操作 单条数据查询及更新 数据的校验 单个字段的校验 多个字段的校验 自定义校验器 终极用法 ModelSerializer 前后端分离后, ...

  8. DRF 序列化组件 模型层中参数补充

    一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...

  9. 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...

随机推荐

  1. 关于各种算法以及好的blog的整理(持续更新)

    一堆博客先扔着,等有空的时候再去看……好像没几个会的…… 以下都是待学习的算法 博弈论 https://www.cnblogs.com/cjyyb/p/9495131.html https://blo ...

  2. 详述MSSQL服务在渗透测试中的利用(上篇)

    前言: 致力于复现最实用的漏洞利用过程. 本文将带领大家学习以下内容: 学习使用`xp_cmdshell`扩展存储过程 学习调用`wscript.shell` 学习MSSQL写文件 学习沙盘模式提权 ...

  3. mybatis四大接口之 Executor

    [参考文章]:Mybatis-Executor解析 1. Executor的继承结构 2. Executor(顶层接口) 定义了执行器的一些基本操作: public interface Executo ...

  4. 字符串编码C#

    给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”.比如字符串AAAABCCDAA会被编码成4A1B2C1D2A. 输入描述: 每个测试输入包含1个测试用例 每个测试用例 ...

  5. Storm的acker确认机制

    Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...

  6. ASP.NET Core 1.0 中使用 Log 日志配置

    https://github.com/aspnet/Logging https://docs.asp.net/en/latest/fundamentals/logging.html ASP.NET C ...

  7. 03-01:springboot 整合jsp

    1.修改pom文件,添加坐标 <!-- jstl -->        <dependency>            <groupId>javax.servlet ...

  8. 利用cygwin创建windows下的crontab定时任务

    要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Cygwin-1.7.35 下载地址 环境下载 什么是Cygwin Cygwin是一个在windows平台上运行的类U ...

  9. zepto中的touch库与fastclick

    1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...

  10. Charles抓包之HTTPS抓包配置

    访问我的博客 前言 由于工作中经常需要配置客户端开发人员对接接口,有时候对接地不太顺利,因此需要经常性地对公司 APP 进行抓包看请求,找出具体的原因. 在公司中开发使用的 Windows 台式电脑, ...