反序列化(不推荐版):
两个字段 一个为正序准备,一个为反序准备
重写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. sublime text 文件打开时回调一些函数

    需求:公司服务端脚本以 .s 结尾的文件,也按 js 语法识别,方便查看函数定义. 每次都 ss:js 比较麻烦,所以写个插件. import sublime, sublime_plugin clas ...

  2. harbor镜像仓库-01-搭建部署

    harbor镜像仓库-01-搭建部署 dockerregistryharbor安装部署docker-compose harbor的https配置参考另一章节harbor镜像仓库-02-https访问配 ...

  3. ubuntu14中把openssh升级到7.5

    经验证可用 下载相关tar.gz包,没有下载到的,可以在这里下载.http://download.csdn.net/download/songanshu/10023663 apt install -y ...

  4. Mac上搭建rtmp流媒体服务器(结合FFmpeg的使用)

    1.确保安装homebrew ---安装则跳到第二步 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ins ...

  5. Java实现二分法排序

    二分法:(二分法不是只能做数组,这里的数组只是为了举例) 在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找, ...

  6. c++中堆、栈、自由存储区和常量存储区(转)

    代码段 --text(code segment/text segment)text段在内存中被映射为只读,但.data和.bss是可写的.text段是程序代码段,在AT91库中是表示程序段的大小,它是 ...

  7. Objective-C 字符串与数值互相转换

    Convert NSString to int NSString *aNumberString = @"123"; int i = [aNumberString intValue] ...

  8. float四舍五入保留一位小数点(坑)

    Float四舍五入保留一位小数点 public class Test {    public static void main(String[] args){        double data1  ...

  9. JavaScript -- Window-Focus

    -----034-Window-Focus.html----- <!DOCTYPE html> <html> <head> <meta http-equiv= ...

  10. Searching with Deep Learning 深度学习的搜索应用

    本文首发于 vivo 互联网技术微信公众号 https://mp.weixin.qq.com/s/wLMvJPXXaND9xq-XMwY2Mg作者:Eike Dehling翻译:杨振涛 本文由来自 T ...