0903自我总结

drf框架序列化和反序列化

from rest_framework import serializers

一.自己对于序列化和反序列化使用的分类

前后端交互主要有get,post,puch,put,deleter

其中用到序列化的get

用到反序列化的剩下四中

二.序列化的使用

1.首先我们要根据我们定义的模型一一对应定义一个继承serializers.Serializer的类

class UserSerializer(serializers.Serializer):
username = serializers.CharField()
#不需要的字段=serializers.CharField(write_only=True)
sex = serializers.IntegerField() gender = serializers.SerializerMethodField()
def get_gender(self, user_obj):
return user_obj.get_sex_display() icon = serializers.SerializerMethodField() #SerializerMethodField为自定义字段
def get_icon(self, user_obj):
icon_url = 'http://127.0.0.1:8000{}{}'.format(settings.MEDIA_URL, user_obj.icon)
return icon_url

自定义字段,拿gander字段举例在models中是

SEX_CHOICES = [
(0, '男'), #choices选择中,括号里前者表示填写的值,后者表示对应的值
(1, '女'),
]
# 为choices的字段,获取值后的映射关系 get_字段名_display()
sex = models.IntegerField(choices=SEX_CHOICES, default=0)
def get_gender(self, user_obj):
return user_obj.get_sex_display()
基于GET请求的get_固定写法
def get_model类中有字段(self,obj):
#逻辑处理
return 修改后的代码

需要序列化字段

  • 在不做任何处理的情况下我们定义的类里面的字段必须在model类中必须存在该字段
  • 参与序列化的属性名必须与model类的属性相同
  • 只出现在序列化中不出现在反序列化中我们要加只读属性read_only=True
  • 如果我们Serializer类中定义字段类型为SerializerMethodField自定义字段类型不用遵守类里面的字段必须在model类中必须存在该字段

不需要序列化字段

  • 不需要序列化的属性字段在序列化类中不需要声明
  • 不需要序列化的属性字段在序列化类中设置只写属性write_only=True

2.在views视图中

from rest_framework.views import APIView
class UserAPIView(APIView):
def get(self, request, *args, **kwargs):
user_obj = models.User.objects.all().frist
user_obj_data = '''我们自定义的Serializer类'''(user_obj).data
return APIResponse(0, 'ok', results=user_obj_data)
  • 获取models中的对象
  • 我们自定义的Serializer类传入models中的对象然后.data
  • 如果models中对象为多个Serializer传入models中的对象以外many=True还需传入这个参数
  • many这个参数默认是False所有我们序列化单个参数时候不需要传入many
  • 序列化数据可以为状态User类的多个对象的单列集合,不能是多列集合

:

  • 单列集合[a,b,c.....] |{a,b,c.....}|(a,b,c.....)|QuerySet
  • 多列集合{k1:v1,k2:v2.......}

三反序列化的使用

1.首先我们要根据我们定义的模型一一对应定义一个继承serializers.Serializer的类

class UserDeserializer(serializers.Serializer):
username = serializers.CharField(
min_length=3,
error_messages={
'min_length': '用户名太短'
}
)
password = serializers.CharField(
min_length=3,
error_messages={
'min_length': '密码太短'
}
)
re_password = serializers.CharField(
min_length=3,
required=True,
error_messages={
'min_length': '确认密码太短',
'required': '确认密码不能为空'
}
)

相较于序列化定义反序列化中增加了条件的筛选

注意点:如果类的字段值应用在反序列化,我们可以在他的字段的属性上加上write_only=True

里面所提及的字段必须传入

常用的约数条件与django中from组件约数条件有点类似:

  • error_messages 错误信息的属性
  • required是否为空
  • max_length 最长
  • min_length 最短
  • invalid 格式

局部钩子

class UserDeserializer(serializers.Serializer):
.......
def validate_字段名称(self,value):
#代码块
if 情况不满足:
raise serializers.ValidationError('异常信息') #抛出异常
return value
#也就是对字段数据进行二次处理

全局钩子

 class UserDeserializer(serializers.Serializer):
.......
def validate(self, attrs):
#attrs是所有字段的一个类似字典的集合
#我们要其中某个字段
attrs.get('字段名')
return attrs
# 最终结果抛出异常或者返回attrs

2.内容新增使用

我们如果想自定义create的相关内容我们可以Serializer类中再加个create方法

class UserDeserializer(serializers.Serializer):
.......
def create(self, validated_data):
try:
return modles中的类.objects.create(**validated_data)
except:
raise IOError('数据库入库失败')

我们更具需求可以先自定义一个APIResponse,继承rest_framework中的Response也可以直接使用他自带的

自定义APIResponse,建议自定义

from rest_framework.response import Response
"""
Response({
'status': 0,
'msg': 'ok',
'results': [],
'token': ''
}, headers={}, status=200, content_type="") APIResponse(0, 'ok', results, status, headers, content_type)
""" class APIResponse(Response):
def __init__(self, data_status, data_msg, results=None,
status=None, headers=None, content_type=None, **kwargs):
data = {
'status': data_status,
'msg': data_msg
}
if results is not None:
data['results'] = results
data.update(kwargs)
super().__init__(data=data, status=status, headers=headers, content_type=content_type)

在视图函数中的设置

class UserAPIView(APIView):
def post(self, request, *args, **kwargs): #一般都是post请求
request_data = request.data
user_ser = '''我们自定义的Serializer类'''(data=request_data) #传入request.data if user_ser.is_valid(): # 自定义处理校验成功的逻辑
user_obj = user_ser.save()
return APIResponse(0, 'ok',
results=serializers.UserSerializer(user_obj).data
)
else: # 自定义返回错误信息
return APIResponse(1, 'failed', results=user_ser.errors)

3.内容修改使用

我们如果想自定义update的相关内容我们可以Serializer类中再加个update方法

class UserDeserializer(serializers.Serializer):
.......
def update(self, instance, validated_data):
# instance自定义传入的要更新的原数据(pk | obj | queryset)
# validated_data校验通过后的新数据
# instance的值外部反序列化传入要更新的自定义标识决定
instance.update(**validated_data)
return instance.first()

在视图函数中的设置

单整体改

class UserV2APIView(APIView):

    def put(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if not pk:
return APIResponse(1, 'pk error') user_query = models.User.objects.filter(pk=pk, is_delete=False)
if not user_query:
return APIResponse(1, 'user error') # 第一种:user_query完成数据的更新
# user_query = models.User.objects.filter(pk=pk)
# user_query.update(**kwargs) # 第二种:user_obj完成数据的更新
# user_obj = models.User.objects.filter(pk=pk).first() # type: models.User
# user_obj.username = 'new_username'
# ...
# user_obj.save() #这里的instance必须传参(pk | obj | queryset)
request_data = request.data
user_ser = serializers.UserV2Serializer(instance=user_query, data=request_data)
if user_ser.is_valid():
# save的返回值是由update内部自定义的返回值决定
user_obj = user_ser.save()
return APIResponse(0, 'ok',
results=serializers.UserV2Serializer(user_obj).data
)
else:
return APIResponse(1, 'failed', user_ser.errors)

单删单体修改

现在数据都是很重要的一般情况下不会吧数据删除只会做个标记字段其本质还是局部更新

    def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if not pk:
return APIResponse(1, 'pk error')
user_obj = models.User.objects.filter(pk=pk, is_delete=False).first()
if not user_obj:
return APIResponse(1, '删除失败')
user_obj.is_delete = True
user_obj.save()
return APIResponse(0, '删除成功')

四.model字段修订与时区修改

model.py

    create_time = models.DateTimeField(auto_now_add=True, null=True)
is_delete = models.BooleanField(default=False)

setting.py

时区相关设置

LANGUAGE_CODE = 'zh-hans'   #其中 zh-Hans是简体中文  zh-Hant是繁体中文

TIME_ZONE = 'Asia/Shanghai'  #上海时间

USE_I18N = True   #国际化支持 I18N

USE_L10N = True

USE_TZ = False   #USE_TZ设置为True,Django会使用系统默认设置的时区即America/Chicago,此时的TIME_ZONE不管有没有设置都不起作用。

注意点:

USE_TZ为True,TIME_ZONE不管有没有设置都不起作用

drf框架序列化和返序列化的更多相关文章

  1. 序列化和返序列化的概述和对象的序列化流ObjectOutputStream

    序列化和返序列化的概述 对象的序列化流ObjectOutputStream Person类: package com.yang.Test.ObjectStreamStudy; import java. ...

  2. 0012 基于DRF框架开发(04 序列化器的字段与选项)

    1 常用字段类型 字段 构造方式 BooleanField BooleanField() NullBooleanField NullBooleanField() CharField CharField ...

  3. Java对象序列化和返序列化

    public class SerializeUtil { /** * 序列化 * * @param object * @return */ public static byte[] serialize ...

  4. c#如何使用MemoryStream和BinaryFormatter进行对象的序列化和返序列化

    1 下面是我写的一个序列化的类 public static class ObjSerialize { /// <summary> /// 将对象数组obj序列化,内存中的缓冲区的数据序列化 ...

  5. C# 关于使用JavaScriptSerializer 序列化与返序列化的操作

    //开始解析  //引用 //using System.Web.Script.Serialization; JavaScriptSerializer js = new JavaScriptSerial ...

  6. DRF框架之序列化器初体验

    首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...

  7. DRF框架学习总结

    DRF框架安装配置及其功能概述 Django与DRF 源码视图解析 DRF框架序列化和返序列化 DRF框架serializers中ModelSerializer类简化序列化和反序列化操作 DRF源码s ...

  8. DRF框架之 serializers 序列化组件

    1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...

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

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

随机推荐

  1. 去重合并两个有序链表之直接操作和Set集合操作

    两者思路对比: 直接操作:因为传入的是两个有序的链表,所以说我就直接以其中一个链表为基准,与另外一个链表比较,只将比返回值链表的最后一个记录的值大的插入,不将等值的插入,理论时间复杂度为O(n) Se ...

  2. [1]尝试用Unity3d制作一个王者荣耀(持续更新)->AssetBundle管理器

    如果已经看过本章节:目录传送门:这是目录鸭~ 1.AssetBundleManager: 首先我们创建一个文件夹,叫AssetBundleManager,再创建Csharp(即C#)脚本,名为Asse ...

  3. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  4. 【深入浅出-JVM】(76):classloader

    方法 public Class<?> loadClass(String name) throws ClassNotFoundException 通过类名发挥这个类的Class实例 prot ...

  5. 一些简单的Linux命令(centos修改网络ip,修改主机名)

    环境:linux centos 7 vi /etc/sysconfig/network-scripts/ifcfg-enp3s0f0 可以修改网关地址,网络IP地址,子网地址等等 [root@loca ...

  6. JDK11,JDK12没有JRE的解决方法

    jdk11和jdk12在以前版本基础上,改动有点大,安装后默认是没有jre的. 解决方法: 在JDK目录下使用bin\jlink.exe --module-path jmods --add-modul ...

  7. Python实现语音识别和语音合成

    声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移. 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, ...

  8. u盘重装ubuntu16.04过程遇到的问题

    该博文主要记录ubuntu16.04重装过程中分区问题 1. /swap交换区,Logical(逻辑分区),swap area; 一般为物理内存的2倍; 例如你电脑的运行内存是4G, 则/swap可以 ...

  9. charles 自动存储/auto_save

    本文参考:charles 自动存储 自动保存工具 auto_save "自动保存"工具会在你设定的间隔后,自动保存并清除抓取到的内容.假设你设置了3分钟,则每隔三分钟会保存一次, ...

  10. smartbits国产版本minismb – windows 10 用户界面无法正常显示

    Minismb测试仪表是复刻smartbits的国产版本,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和 ...