serializers 序列化器里面进行 校验等
一.第一版(一般不用)
# 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book
class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=32)
class AuthorSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=32)
#自定义字段def my_validate(value): if 'xxoo' in value.lower(): #抛敏感词汇 raise serializers.ValidationError('敏感词汇') return value
class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) title = serializers.CharField(max_length=32,)# 自定义的加这个参数 validators=[my_validate,] pub_time = serializers.DateField() category=serializers.CharField(source='get_category_display',read_only=True) #此处为多选时用 #read_only = True 正序查找 publisher=PublisherSerializer(read_only=True) #多对一 authors=AuthorSerializer(many=True,read_only=True) #多对多用 many=True
#write_only =True 反序查找 要重新定义 post_category = serializers.IntegerField(write_only=True) publisher_id = serializers.IntegerField(write_only=True) author_list = serializers.ListField(write_only=True)
#重写 create 方法 def create(self, validated_data): #validated_data 校验通过的数据 就是book_obj # 通过ORM操作给Book表增加数据 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['author_list']) return book_obj
#重写update 方法def update(self, instance, validated_data): # instance 更新的book_obj 对象 # validated_data 校验通过的数据 # ORM做更新操作 对每个字段进行更新 instance.title=validated_data.get('title',instance.title) instance.pub_time = validated_data.get("pub_time", instance.pub_time) instance.category = validated_data.get("post_category", instance.category) instance.publisher_id = validated_data.get("publisher_id", instance.publisher_id) #此处是对多对多个字段 进行查询 if validated_data.get("author_list"): #set 因为是列表多个数据 instance.authors.set(validated_data["author_list"]) #编辑一定要更新 instance.save() return instance
# 对单个值进行校验 def validate_title(self,value): # value就是title的值 对value处理 if 'xxoo' not in value.lower(): raise serializers.ValidationError('少东西了') return value
#对所有字段进行 校验 def validate(self, attrs): # attrs 字典有你传过来的所有的字段 if 'xxoo' in attrs['title'].lower() and attrs["post_category"] == 1: return attrs else: raise serializers.ValidationError('分类或标题不合符要求')
二.第二版本(用这个)用这个添加表里面的信息 直接用字段名
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 就是序列化的每个Book对象 def get_category_display(self,obj): return obj.get_category_display()
#一对多查找 def get_publisher_info(self,obj): #找到查找外键的对象 publisher_obj=obj.publisher #返回publisher表的内容 return {'id':publisher_obj.id,'title':publisher_obj.title}
#多对多的查找 def get_authors_info(self,obj): #找到所有的对象 authors_obj=obj.authors.all() # 返回authors表的内容 推到式 return [{"id":i.id,'name':i.name}for i in authors_obj]
class Meta: model=Book fields='__all__' # exclude=["id"] # 会让你这些所有的外键关系变成read_only = True 最多4层 不建议用 # depth = 1
#相当于extra_kwargs={"默认的字段名称":{自定义的参数配置信息}} #用在反序列化 给表字段添加参数 extra_kwargs={'publisher':{'write_only':True}, "authors": {"write_only": True}}
serializers 序列化器里面进行 校验等的更多相关文章
- drf序列化器serializers.SerializerMethodField()的用法
问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...
- DRF 序列化器-Serializer (2)
作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...
- Serializers 序列化组件
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
- DRF中的序列化器
DRF中的序列化器详细应用 视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...
- drf3 Serializers 序列化组件
为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...
- Serializers序列化组件
Django的序列化方法 .values 序列化结果 class BooksView(View): def get(self, request): book_list = Book.objects.v ...
- django rest_framework Serializers 序列化组件
为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...
- 【转】Serializers 序列化组件
https://www.cnblogs.com/MayDayTime/p/9890582.html 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON ...
随机推荐
- Linux kernel 不输出log信息
/********************************************************************************* * Linux kernel 不输 ...
- Docker使用rexray做跨主机存储
Rex-Ray 是一个优秀的 Docker volume driver,不过只有最新版docker才支持. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很 ...
- HDU 1251:统计难题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意不难理解,就是先输入不知道多少个字符串,然后用一个空行结束这个输入,然后接下来不知道多少行再 ...
- 一致性哈希算法(Consistent Hashing Algorithm)
一致性哈希算法(Consistent Hashing Algorithm) 浅谈一致性Hash原理及应用 在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如 ...
- cf 557D 二分图黑白染色
题意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种 奇环和偶环其实就是二分图的性质:二分图不存在奇环,所以只要判断这张图是否是二分图就行了: 如果本身就不是二 ...
- hdu 5182 结构体排序
BC # 32 : 打 BC 的时候没看全三个关键字,WA 了五发,花了近一小时,问了一下才发现少看一个条件,于是顺利给跪. 题意:给出若干城市的两次空气质量,首先按空气质量差排序,若相等则按第二次排 ...
- kettle的输入输出组件和脚本组件
一. 输入组件 1.1表输入 从指定的数据库中,通过sql语句来查询数据加载到内存. 允许简易转换:勾选后可以避免不必要的字段的数据类型转换,从而提高性能. 替换sql语句里的变量:勾选后可以通过${ ...
- Codelf 变量取名
Codelf 变量取名 可以看到别的变量是怎么命名的,站在巨人的肩膀上.
- Oracle 基于用户管理恢复的处理
================================ -- Oracle 基于用户管理恢复的处理 --================================ Oracle支持多种 ...
- IE8下部分方法失效的解决方法
1.IE8下String的Trim()方法失效的解决方法 用jquery的trim()方法,$.trim(str)就可以了: 例:_id.trim() !='' 改为 $.trim(_id) != ...