三流

import sys
#标准输出流
sys.stdout.write('123\n')
sys.stdout.write('456\n')
#标准输入流
res=sys.stdin.readline()
print(res)
#标准错误流:将括号内数据作为错误输出
sys.srderr.write('abc\n')
sys.stderr.write('xyz\n)

注意:每个流之间为异步提交,流内为同步提交.

JSON文件格式

JSON 值可以是:
  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null
JSON 语法规则:
  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

为什么要使用序列化器

drf中的response方法只能接收json数格式,并将json数据解析为二进制格式发送给前端,也可以更以更方便的方法对数据进行验证以及数据库操作.

序列化家族

  1. Serializer类,底层是序列化类,(了解原理)
  2. ModelSerializer类,模型序列化类(核心)
  3. ListSerializer类:群操作序列化类(辅助类)

手动序列化

前后端交互,通过json格式文件进行传输,使用djangoORM语句将对象从数据库中找出来进行交互,需要手动序列化转为json格式再进行交互.

class UserV1APIView(APIView):
# 单查群查
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
user_dic = models.User.objects.filter(is_delete=False, pk=pk).values('username', 'sex', 'img').first()
if not user_dic:
return Response({
'status': 1,
'msg': 'pk error',
}, status=400) user_dic['img'] = '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, user_dic.get('img'))
return Response({
'status': 0,
'msg': 'ok',
'results': user_dic
})
else:
user_query = models.User.objects.filter(is_delete=False).values('username', 'sex', 'img').all()
for user_dic in user_query:
user_dic['img'] = '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, user_dic.get('img'))
user_list = list(user_query)
return Response({
'status': 0,
'msg': 'ok',
'results': user_list
})

Serializer序列化类

序列化

新建serializers.py文件,文件中进行Serializer类的操作

from rest_framework import serializers
from django.conf import settings
from . import models
class UserSerializer(serializers.Serializer):
# 1)字段名与字段类型要与处理的model类对应
# 2)不提供的字段,就不参与序列化给前台
# 3)可以自定义序列化字段,采用方法序列化,方法固定两个参数,第二个参数就是参与序列化的model对象
# (严重不建议自定义字段名与数据库字段名重名,由get_自定义字段名方法的返回值提供字段值)
username = serializers.CharField()
# sex = serializers.IntegerField()
# sex = serializers.SerializerMethodField() # 不建议这样命名
gender = serializers.SerializerMethodField() def get_gender(self, obj):
return obj.get_sex_display() # 注:在高级序列化与高级视图类中,drf默认帮我们处理图片等子资源
icon = serializers.SerializerMethodField() def get_icon(self, obj):
return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, obj.img)

使用改名显示字段,官方建议使用在models类中定义属性方法

#models中
# 第二种自定义序列化字段(插拔式,提倡使用)
@property
def gender(self):
return self.get_sex_display() @property
def icon(self):
from django.conf import settings
return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)

总结:

  1. 设置序列化字段,字段名与字段类型要与处理的model类属性名对应(只参与序列化的类型不需要设置条件)

  2. model类中有的字段,但在序列化中没有对应字段,该类字段不参与序列化

  3. 自定义序列化字段(方法一),字段类型为SerializerMethodField(),值有 get_自定义字段名(self, model_obj) 方法提供,

    一般值都与参与序列化的model对象(model_obj)有关

反序列化

class UserDeSerializer(serializers.Serializer):
# 系统校验字段
username = serializers.CharField(min_length=3, max_length=16, error_messages={
'min_length': '太短',
'max_length': '太长'
})
password = serializers.CharField(min_length=3, max_length=16) # 不写,不参与反序列化,写就必须参与反序列化(但可以设置required=False取消必须)
# required=False的字段,前台不提供,走默认值,提供就一定进行校验;不写前台提不提供都采用默认值
sex = serializers.BooleanField(required=False) # 自定义校验字段:从设置语法与系统字段没有区别,但是这些字段不能参与入库操作,需要在全局钩子中,将其取出
re_password = serializers.CharField(min_length=3, max_length=16) # 局部钩子:
# 方法就是 validate_校验的字段名(self, 校验的字段数据)
# 校验规则:成功直接返回value,失败抛出校验失败信息
def validate_username(self, value):
if 'g' in value.lower():
raise serializers.ValidationError('名字中不能有g')
return value # 全局钩子:
# 方法就是 validate(self, 所有的校验数据)
# 校验规则:成功直接返回attrs,失败抛出校验失败信息
def validate(self, attrs):
password = attrs.get('password')
re_password = attrs.pop('re_password')
if password != re_password:
raise serializers.ValidationError({'re_password': '两次密码不一致'})
return attrs # 在视图类中调用序列化类的save方法完成入库,Serializer类能做的增入库走create方法,改入库走update方法
# 但Serializer没有提供两个方法的实现体
def create(self, validated_data):
return models.User.objects.create(**validated_data) # instance要被修改的对象,validated_data代表校验后用来改instance的数据
def update(self, instance: models.User, validated_data):
# 用户名不能被修改
validated_data.pop('username')
models.User.objects.filter(pk=instance.id).update(**validated_data)
return instance

对于数据的校验,需要通过自定义系统方法,自定义局部以及全局钩子的方法进行校验.还需要自己写create以及update方法.

ModelSerializer序列化类

class UserModelSerializer(serializers.ModelSerializer):
# 第一种自定义序列化字段:该字段必须在fields中设置
# gender = serializers.SerializerMethodField()
# def get_gender(self, obj):
# return obj.get_sex_display() # 自定义反序列化字段同Serializer类,且规则只能在此声明中设置,或是在钩子中设置,
# 在extra_kwargs中对其设置的无效
# 注:自定义反序列化字段与系统字段,设置规则一样,所以必须设置 write_only
re_password = serializers.CharField(min_length=3, max_length=16, write_only=True) class Meta:
model = models.User
# fields采用 插拔式 设置所有参与序列化与反序列化字段
fields = ('username', 'gender', 'icon', 'password', 'sex', 're_password')
extra_kwargs = {
'username': { # 系统字段不设置read_only和write_only,默认都参加
'min_length': 3,
'max_length': 10,
'error_messages': {
'min_length': '太短',
'max_length': '太长'
}
},
'gender': {
'read_only': True, # 自定义的序列化字段默认就是read_only,且不能修改,可以省略
},
'password': {
'write_only': True,
},
'sex': { # 像sex有默认值的字段,为选填字段('required': True可以将其变为必填字段)
'write_only': True,
# 'required': True
}
} # 局部全局钩子同Serializer类,是与 Meta 同缩进的
def validate_username(self, value):
if 'g' in value.lower():
raise serializers.ValidationError('名字中不能有g')
return value def validate(self, attrs):
password = attrs.get('password')
re_password = attrs.pop('re_password')
if password != re_password:
raise serializers.ValidationError({'re_password': '两次密码不一致'})
return attrs # create和update方法不需要再重写,ModelSerializer类已提供,且支持所有关系下的连表操作

总结:

  1. 序列化类继承ModelSerializer,所以需要在配置类Meta中进行配置
  2. model配置:绑定序列化相关的Model表
  3. fields配置:采用 插拔式 设置所有参与序列化与反序列化字段
  4. extra_kwargs配置: 划分系统字段为三种:只读(read_only)、只写(write_only)、可读可写(不设置) 字段是否必须:required 选填字段:在extra_kwargs进行配置,但不设置required,且有默认值
  5. 自定义序列化字段: 第一种(不提倡):在序列化类中用SerializerMethodField()来实现 第二种(提倡):在模型类中用@property来实现,可插拔
  6. 自定义反序列化字段: 同Serializer类,且规则只能在此声明中设置,或是在钩子中设置,在extra_kwargs中对其设置的无效 自定义反序列化字段与系统字段,设置规则一样,所以必须设置 write_only
  7. 局部钩子,全局钩子同Serializer类
  8. 不需要重写create和update方法

drf的序列化器的更多相关文章

  1. DRF中序列化器定义及使用

    首先需要明白序列化和反序列化的定义及作用: 序列化是将程序语言转换为JSON/XML; 反序列化是将JSON/XML转换为程序语言; 对应到Django中,序列化即把模型对象转换为字典形式, 在返回给 ...

  2. drf之序列化器的使用

    一.序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经 ...

  3. 066.Python框架DRF之序列化器Serializer

    一 序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成 ...

  4. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  5. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  6. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  7. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  8. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  9. DRF之解析器组件及序列化组件

    知识点复习回顾一:三元运算 三元运算能够简化我们的代码,  请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达 ...

随机推荐

  1. [JZOJ5977] 【清华2019冬令营模拟12.15】堆

    题目 其中n,q≤500000n,q\leq 500000n,q≤500000 题目大意 让你维护一个堆.支持一下操作: 在某个点的下面加上另一个点,然后进行上浮操作. 询问某一点的权值. 思考历程 ...

  2. Java实现RSA加密

    末尾贴上代码↓↓↓↓↓↓↓↓↓↓↓↓  1.原理 2.实现过程 3. 公式 4.举例  p=13, q=11 ,  (p,q互质)  N=p*q=143 L=(p-1)*(q-1)=120 E=7   ...

  3. CSS动画之transition属性

    transition 属性 简介 transition(过渡)) 是指从一个状态到另一个状态的变化.比如当鼠标在某个元素上悬停时,我们会修改它的样式,采用 transition 可以创建一个平滑的动画 ...

  4. 为什么Java中的String是设计成不可变的?(Why String is immutable in java)

    There are many reasons due to the string class has been made immutable in Java. These reasons in vie ...

  5. Spark-内存管理调优

    这篇文章主要是对官网内容学习过程的总结,大部分是原文,加上自己的学习笔记!!! spark 2.0+内存模型 调优内存使用时需要考虑三个因素: 对象使用的内存数量(您可能希望您的整个数据集都能装入内存 ...

  6. HttpServletRequest request 获取当前登录的用户-获取当前用户

    有的业务需要知道当前登录的用户 当然需要引用这个啦 import javax.servlet.http.HttpServletRequest; 然后 HttpSession session = req ...

  7. 网络爬虫技术Jsoup

    Jsoup介绍:Jsoup 是一个 Java 的开源HTML解析器,可直接解析某个URL地址.HTML文本内容 Jsoup主要有以下功能: 1. 从一个URL,文件或字符串中解析HTML 2. 使用D ...

  8. window API GetProcessId OpenProcess

    函数原型: DWORD WINAPI GetProcessId( _In_ HANDLE Process ); HANDLE OpenProcess( DWORD dwDesiredAccess, / ...

  9. 高德地图定位不到 报错 location Error, ErrCode:7, errInfo:KEY错误 请到http://lbs.amap.com/api/android-location-sdk/abouterrorcode/查看错误码说明.

    出现该问题的可能是高德地图的配置不准确: 仔细配对一下 看sha1 是否是通过应用签名生成的  要区分发布版的sha1 跟调试版的sha1  是不相同的 (小编我第一次反这种错误的时候 是因为我把高得 ...

  10. react使用swiper,解决添加点击事件首位图片点击失效,解决轮播按钮被覆盖问题

    JS部分 createSwiper1() { var option = { // slidesPerView: 5, slidesPerView: 3, centeredSlides:true, }; ...