反序列化(不推荐版):
两个字段 一个为正序准备,一个为反序准备
重写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. java中身份证号和的银行卡的深度校验

    一: 身份证号: package com.mobile.utils; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  2. python使用selector模块编写FTP

    server import os import socket import time import selectors BASE_DIR = os.path.dirname(os.path.abspa ...

  3. [LeetCode]138复制带随机指针的链表

    题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 思路: 先遍历链表,将每个节点对应的随机指针指向的对象利用Hash ...

  4. 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

    可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...

  5. odoo 开发基础 -- 视图之xpath语法

    odoo 视图函数 在整个项目文件中,结构并不是十分明显,虽然它也遵循MVC设计,类比django的MTV模式,各个模块区分的十分明显,在Odoo中,视图的概念不是特别明显,很多时候,我们会将调用模型 ...

  6. (转)Python3入门之线程threading常用方法

    原文:https://www.cnblogs.com/chengd/articles/7770898.html https://blog.csdn.net/sunhuaqiang1/article/d ...

  7. Javac中的nullcheck

    Javac会通过调用引用对象的getClass()来判空,主要有几处: (1)JCMethodInvocation()方法中,如下实例: class A{ class B{} } public cla ...

  8. javascript 获取当前浏览器窗口宽高

    获取当前浏览器窗口宽度:document.documentElement.clientWidth;获取当前浏览器窗口高度:document.documentElement.clientHeight; ...

  9. jmeter接口自动化部署jenkins教程

    首先,保证本地安装并部署了jenkins,jmeter,xslproc 我搭建的自动化测试框架是jmeter+jenkins+xslproc ---注意:原理是,jmeter自生成的报告jtl文件,通 ...

  10. C++ string中的几个小陷阱,你掉进过吗?

    C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1.  结构体中的stri ...