DRF序列化/反序列化
反序列化(不推荐版):
两个字段 一个为正序准备,一个为反序准备
重写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序列化/反序列化的更多相关文章
- drf序列化器与反序列化
什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...
- drf序列化及反序列化
假如把drf看做一个汉堡包,我们之前讲的模块属于汉堡包前面的盖盖(请求模块.渲染模块)和底底(异常模块.解析模块.响应模块),但是真正中间的夹心没有讲,那么今天我就和大家来看一下汉堡包的夹心(序列化及 ...
- drf序列化和反序列化
目录 drf序列化和反序列化 一.自定义序列化 1.1 设置国际化 二.通过视图类的序列化和反序列化 三.ModelSerializer类实现序列化和反序列化 drf序列化和反序列化 一.自定义序列化 ...
- DRF 序列化组件
Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...
- Django的DRF序列化方法
安装rest_framework -- pip install djangorestframework -- 注册rest_framework序列化 -- Python--json -- 第一版 用v ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...
- 【DRF序列化】
目录 基本的序列化操作 外键/多对多关系的序列化 反序列化的操作 单条数据查询及更新 数据的校验 单个字段的校验 多个字段的校验 自定义校验器 终极用法 ModelSerializer 前后端分离后, ...
- DRF 序列化组件 模型层中参数补充
一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...
- 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)
知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...
随机推荐
- tomcat单机多实例部署
最近在面试的过程中,一家公司在面试时提到了有关tomcat单机多实例部署的提问, 正好, 之前使用IntelliJ IDEA 13.1.4这款IDE开发web项目,在开发的过程中,因为有多个web项目 ...
- typescript-koa-postgresql 实现一个简单的rest风格服务器 —— typescript 开发环境配置
最近需要用 nodeJS 写一个后台程序,为了能够获得 IDE 的更多代码提示,决定用 typescript 来编写,随便也学习下 ts,在这记录下实现过程. 1.新建文件夹 typescript-k ...
- python爬虫----XPath
1.知道本节点元素,如何定位到兄弟元素 详情见博客 XML代码见下 bt1在文档中只出现一次,所以很容易获取到bt1中内容,那怎么根据<td class='bt1'>来获取bt2中的内容 ...
- DockPanel与GeckoFX、ChrominumFX、CefSharp结合使用问题
在使用DockPanel与ChrominumFx时,当在以下条件下拖动窗体时,会发生ChromiumWebBrowser崩溃的情况,此种情况也会在DockPanel与GeckoFX或CefSharp结 ...
- [转载]sql server 分布式查询
--用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB' ,'sq ...
- 剑指offer七之斐波那契数列
一.题目 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39. 二.思路 序号: 0 1 2 3 4 5 ...
- Python动态变量名定义与调用
动态变量名赋值 在使用tkinter时需要动态生成变量,如动态生成var1...var10变量 使用exec动态赋值 exec在python3中是内置函数,它支持python代码的动态执行. 示例: ...
- Mysql大数据表优化处理
原文链接: https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表 ...
- 02-03:springboot 整合listener
1.通过注解扫描完成Listener组件的注册 1.1 编写listener /** * Springboot 整合listener */ import javax.servlet.ServletCo ...
- ListView中的TextView实现跑马灯效果
1.TextView首先添加android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forev ...