当前位置: 首页 > 编程日记 > 正文

DRF序列化和反序列化

一、自定义序列化组件

  • 新建一个任意名的py文件,里面导入serlizer
from rest_framework import serializers
自定义一个类继承serializers,里面写需要序列化的字段
  1. 方法一:继承serializers.Serializer
class BookSerlizer(serializers.Serializer):title = serializers.CharField()price = serializers.IntegerField()pub_date = serializers.DateField()# source 可以指定一个字段也可以指定一个方法publish = serializers.CharField(source='publish.name')# 获取作者所有的信息,指定SerializerMethodField之后,可以对应一个方法,返回什么内容,authors就是什么内容authors = serializers.SerializerMethodField(read_only=True)#  对应的方法固定写法get_字段名def get_authors(self, obj):author_ser = AuthorSerlizer(obj.authors.all(), many=True)return author_ser.data
方法二:继承serializers.ModelSerializer
class BookSerializer(serializers.ModelSerializer):class Meta:model=models.Book# fields=('nid','name')#不能跟fields同时使用# exclude=['name',]fields=('__all__')#深度是1,官方建议不要超过10,个人建议不要超过3# depth=1authors=serializers.SerializerMethodField()def get_authors(self,obj):ret=AuthorSerializer(instance=obj.authors.all(),many=True)return ret.dataname=serializers.CharField()
  • 视图层
class Books(APIView):def get(self, request):back_dic = {'code': 100,'msg': '查询成功',}# 获取所有的图书数据books = models.Book.objects.all()# print(books)# 序列化数据,many为True序列化多条数据,false序列化一条数据# instance 序列化,data 反序列化book_ser = BookSerlizer(instance=books, many=True)# print(book_ser)# 获取序列化后的数据back_dic['data'] = book_ser.dataprint(back_dic)return Response(back_dic)

二、高级用法

1.source 的用法

  • 可以指向字段
from rest_framework import serializersclass BookSerializer(serializers.Serializer):book_name = serializers.CharField(source='book')price = serializers.CharField()# 指向字段名publish = serializers.CharField(source='publish.name')
可以指定方法
class BookSerializer(serializers.ModelSerializer):# 指向方法book_type =serializers.CharField(source='get_xx_display',read_only=True)

三、序列化总结

-序列化的两种方式
-Serializers:没有指定表模型-source:指定要序列化哪个字段,可以是字段,可以是方法- SerializerMethodField的用法authors=serializers.SerializerMethodField()def get_authors(self,obj):ret=AuthorSerializer(instance=obj.authors.all(),many=True)return ret.data-ModelSerializers:指定了表模型class Meta:model=表模型#要显示的字段fields=('__all__')fields=('id','name')#要排除的字段exclude=('name')#深度控制depth=1
-重写某个字段在Meta外部,重写某些字段,方式同Serializers

四、反序列化

1、使用继承了Serializers序列化类的对象

  • 序列化生成器中:自己重写create方法保存数据
def create(self, validated_data):# print('1',validated_data)publish = validated_data.pop('publish')publish_obj = models.Publish.objects.filter(name=publish['name']).first()# print(publish_obj)validated_data['publish'] = publish_objres = models.Book.objects.create(**validated_data)return res
视图层
def post(self, request):back_dic = {'code': 100,'msg': '',}# 反序列化传入databook_ser = BookSerlizer(data=request.data)# print('1',request.data)# 校验数是否合法print(book_ser.is_valid())# print(book_ser.errors)if book_ser.is_valid():print(book_ser.validated_data)book_ser.create(book_ser.validated_data)back_dic['data'] = book_ser.validated_databack_dic['msg'] = '新增成功'# print(back_dic)return Response(back_dic)

2、使用继承了ModelSerializers序列化类的对象,反序列化

  • 序列化生成器中不需要修改
  • 视图函数中直接调用save方法
def post(self,request):bookser=BookSerializer(data=request.data)if bookser.is_valid():ret=bookser.save()return Response()

五、反序列化的校验——钩子函数

  • 局部钩子
   def validate_name(self,value):print(value)if value.startswith('sb'):raise exceptions.ValidationError('不能以sb开头')return value
全局钩子
    def validate(self,attrs):print(attrs)if attrs.get('price')!=attrs.get('xx'):raise exceptions.ValidationError('name和price相等,不正常')return attrs
反序列化的校验
        -validate_字段名(self,value):
            -如果校验失败,抛出ValidationError(抛出的异常信息需要去bookser.errors中取)
            -如果校验通过直接return value
        -validate(self,attrs)
            -attrs所有校验通过的数据,是个字典
            -如果校验失败,抛出ValidationError
-如果校验通过直接return attrs

转载于:https://www.cnblogs.com/king-home/p/11126427.html

相关文章:

设计模式学习笔记-中介模式

概述: 用中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以对立地改变他们之间的…

【数据库】兴唐第二十七节课之jdbc的使用

使用jdbc修改数据库表中的信息 package java27practice;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {Connection conn null;Stat…

windows 2008 R2无法创建性能收集器

问题: 检查排除方法: 1.确保用户有权限 Http://technet.microsoft.com/zh-cn/library/cc749154(WS.10).aspx (参考: 2.确保 Distributed Transaction Coordinator服务 及Task Scheduler服务有启动。 3.检查 C:\Windows\System32\T…

Silverlight WCF RIA服务(二十三)Silverlight 客户端 4

DomainDataSource WCF RIA Services提供DomainDataSource控件来简化用户界面和域上下文中数据的交互。通过DomainDataSource,我们可以只是用声明性语法来检索、编辑数据。我们指定域上下文与DomainDataSource一起使用,然后通过这个上下文来调用操作。Dom…

Storm Trident示例function, filter, projection

以下代码演示function, filter, projection的使用,可结合注释 省略部分代码,省略部分可参考:https://blog.csdn.net/nickta/article/details/79666918 FixedBatchSpout spout new FixedBatchSpout(new Fields("user", "score…

解决 sh: java: command not found 问题

在执行脚本上加入如下配置即可#!/bin/bashJAVA_HOME/usr/java/jdk1.8.0_152export PATH$PATH:$JAVA_HOME/bin转载于:https://www.cnblogs.com/jimw/p/11126437.html

【数据库】 兴唐第二十七节课只sql注入

首先来一个用户登录程序 public static void login(String username, String password) {Connection conn null;Statement stat null;ResultSet rs null; try {Class.forName("com.mysql.jdbc.Driver");String url "jdbc:mysql://127.0.0.1:3306/tyrantfor…

SIEM部署的几条最佳实践

2010年11月12号,NetworkWorld发表了一篇文章——《SIEM部署的最佳实践》,业界同仁给出了他的一些建议。 这些建议主要是针对Verizon2010年的那个DBIR报告中提到的日志缺失造成的严重问题。 至于建议,主要有: 1)先要搞明…

ffmpeg解码视频存为BMP文件

ffmpeg解码视频存为BMP文件 分类&#xff1a; ffmpeg2011-07-28 12:13 8人阅读 评论(0) 收藏 举报view plain#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma once #ifdef __cplusplus extern …

(四)Asp.net web api中的坑-【api的返回值】

&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】 原文:&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】void无返回值IHttpActionResultHttpResponseMessage自定义类型我这里并不想赘述这些返回类型&#xff0c; 可以参考博文http://blog.c…

如何提高编程能力?

其实很多人学编程都会遇到困难&#xff0c;我觉得其中一个根本原因是他们没搞明白学编程到底是学什么。编程不是一种知识&#xff0c;而是一门手艺。我们从小到大的学习都是学习知识&#xff0c;流程一般是课前看书预习&#xff0c;上课听讲&#xff0c;下课做作业&#xff0c;…

【HTML】兴唐第二十八节课之初识HTML

1、HTML&#xff1a;hyper text markup language&#xff08;超级文本标记语言&#xff09;算编程&#xff0c;但HTML不是编程语言 2、注意&#xff1a; &#xff08;1&#xff09;所有的HTML文件都是以.html或者htm作为扩展名 &#xff08;2&#xff09;html文件需要被浏览…

Nagios插件NDOUtils安装

1.DBI的安装# wget http://www.cpan.org/modules/by-module/DBI/DBI-1.608.tar.gz # tar zxvf DBI-1.608.tar.gz # cd DBI-1.608# perl Makefile.PL# make# make test# make install2.DBD的安装# wget http://www.cpan.org/modules/by-module/DBD/DBD-mysql-4.011.tar.gz # tar…

maven 获取pom.xml的依赖---即仓库搜索服务

常用仓库地址&#xff1a; http://repository.sonatype.org/ (https://repository.sonatype.org/)如下图&#xff1a; http://www.mvnrepository.com 转载于:https://www.cnblogs.com/hblthink/p/8643137.html

XFile 关键帧动画的解析遇到的问题

一、mesh 数据储存方式的修改 由于在设计CXFileMesh类时考虑不够全面&#xff0c;原CXFileMesh 类内部储存mesh数据采用的是vector模板。这使后来试图为该类添加支持3dsmax关键帧动画功能时带来很大麻烦。最后还是对CXFileMesh 类做了整体修改&#xff1a;用二叉树储存mesh数据…

【HTML】兴唐二十八节课之常用标签(不定期更新)

部分属性的详细参数见菜鸟教程 &#xff08;1&#xff09;换行 <br/> (2)字体设置颜色和大小 <font size 6 color blue>小米巨能写</font> &#xff08;3&#xff09;添加图片 <img src "index.jpg" width "300px"> 注&…

Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?

这是因为Python3中&#xff0c;str的输出是调用类的实例方法__str__来输出&#xff0c;如果__str__方法没有重写&#xff0c;则自动继承object类的__str__方法&#xff0c;而object类的__str__方法是调用__repr__方法&#xff0c;因此自定义类未重写__str__方法的情况下&#x…

IT人士的人际关系压力

感谢听心心理学网站的投递在造成IT从业者的众多压力之中&#xff0c;人际关系带来的压力或许是最明显并且循环效应最强的一种。IT行业的冷漠环境是出了名的&#xff0c;在这样的状态之下&#xff0c;如何调整我们的人际关系&#xff0c;将恶性循环改造成良性循环&#xff0c;对…

软件工程网络15结对编程作业

软件工程网络15结对编程作业 1.项目成员 学号&#xff1a;201521123014 博客地址&#xff1a;http://www.cnblogs.com/huangsh/学号&#xff1a; 201521123102 博客地址&#xff1a;http://home.cnblogs.com/u/hyy786030686/结对编程码云项目地址&#xff1a;https://gitee.com…

【THML】兴唐第二十八节课 几个小程序

1、第一个html文件 <HTML><Head><title>小米商城</title></head><body><font size 6 color blue>小米巨能写</font><hr /><img src "index.jpg" width "300px"><p>标签组成部分&a…

Android系统默认Home应用程序(Launcher)的启动过程源代码分析

在前面一篇文章中&#xff0c;我们分析了Android系统在启动时安装应用程序的过程&#xff0c;这些应用程序安装好之后&#xff0c;还需要有一个Home应用程序来负责把它们在桌面上展示出来&#xff0c;在Android系统中&#xff0c;这个默认的Home应用程序就是Launcher了&#xf…

Data - 数据思维 - 下篇

9 - 数据解读与表达 数据解读 数据解读需要选择一个基点、一个参照系&#xff0c;单独的一个数值往往不具备价值&#xff0c;它只是数字。 注意点&#xff1a; 关注异常值&#xff0c;并深究WHY?相互验证、大胆假设、多方验证。把握趋势或者规律。归纳总结、数清理明。数据表达…

cas server 配置

1.修改cas server的deployerConfigContext.xml <bean id"dataSource" class"org.apache.commons.dbcp.BasicDataSource"> <property name"driverClassName"> <value>com.microsoft.sqlserver.jdbc.SQLServerDriv…

四 Vue学习 router学习

index.js: 按需加载组件&#xff1a; const login r > require.ensure([], () > r(require(/page/login)), login); 把JS文件分模块&#xff0c;安需加载&#xff0c;而不是&#xff0c;整个都加载。 routes &#xff1a; 定义路径和组件的mapping关系。c…

Oracle 10.2.0.5.4 Patch Set Update (PSU) – Patch No: p12419392

有关Oracle patch和PSU&#xff0c;PSR 说明参考我的blog&#xff1a;Oracle 补丁体系 及opatch 工具 介绍http://blog.csdn.net/tianlesoftware/article/details/5809526Oracle 10g 最新的版本是10.2.0.5.4. 其中的5是PSR 版本号&#xff0c;4是PSU版本号。MOS 上的2篇文档&am…

【数据库】兴唐第二十八节课零散知识点汇总

1、group by order by等都要放到语句的最后 2、表格标签&#xff1a; <table> <tr>表示行 <td>表示一个行里的单元格 </table> 3、表格调整 内容水平方向跳整&#xff1a; align"center" 表示水平居中 align 有三个值&#xff1a;left…

服务器端往手机端推送数据的问题(手机解决方案)

1.方案一&#xff1a; 思路&#xff1a;使用socket连接&#xff0c;在手机端开个socketserver&#xff0c;然后服务器端连接手机端&#xff0c;实现服务器端的不定时发送数据。 MIDlet关闭时, 你可以通过sms激活它. midlet运行时, 你可以通过socket来解决双向推数据的功能. 个人…

软件测试实验一

实验报告 a) The brief description that I install junit, hamcrest and eclemma. Junit&#xff0c;hamcrest 上网下载junit,hamrest包&#xff0c;然后在项目中新建文件夹lib,复制包到其中&#xff0c;然后单击项目->build path -> configer build path,然后在把包加入…

【java】兴唐第二十九节课作业

将用户在网页填写的信息输入数据库 数据库&#xff1a; create table user_infer(id int(2) not null auto_increment primary key,user_name varchar(12), password varchar(64) not null,real_name varchar(8) not null,age int(3) ); JAAVEE stuList <% page langu…

【php】【psr】psr2 编码风格规范

为避免浏览多个作者参与编写的项目时&#xff0c;因风格的不同造成不便时&#xff0c;大家可以使用同一套风格规范来统一标准 代码必须遵循PSR1的规范缩进使用4个空格&#xff0c;而不是TAB键缩进每行代码控制在80-120个每个namespace申明语句后&#xff0c;每个use申明语句块后…