当前位置:网站首页>DRF学习笔记(二):数据反序列化
DRF学习笔记(二):数据反序列化
2022-07-27 14:36:00 【fresh_nam】
前言
本博客是接着上个博客编写的,可以点这里查看
一、数据反序列化使用
1、基本使用
使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
使用:
>>> from demo.serializer import ClassInfoSerializer
>>> data = {
'number': '一', 'grade': '三年级'}
>>> serializer = ClassInfoSerializer(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{
'number': [ErrorDetail(string='A valid integer is required.', code='invalid')]}
2、自定义验证
如果觉得提供的验证方法不够用,还可以自定义验证,有以下三种方法:
(1)validators
在字段中添加validators选项参数,也可以补充验证行为,修改代码:
# 验证函数
def about_grade(value):
if not (value == '一年级' or value == '二年级' or value == '三年级'):
raise serializers.ValidationError("年级输入错误!")
class ClassInfoSerializer(serializers.Serializer):
"""班级数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
number = serializers.IntegerField(label='班级编号', required=False)
grade = serializers.CharField(label='年级', max_length=3, required=False, validators=[about_grade])
studentinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 添加
使用:
>>> from demo.serializers import ClassInfoSerializer
>>> data = {
'grade': '四年级'}
>>> serializer = ClassInfoSerializer(data=data)
结果
(2)validate_<field_name>
要对<field_name>字段进行验证,还可以将代码修改如下:
class ClassInfoSerializer(serializers.Serializer):
"""班级数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
number = serializers.IntegerField(label='班级编号', required=False)
grade = serializers.CharField(label='年级', max_length=3, required=False)
studentinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 添加
def validate_grade(self, value):
if not (value == '一年级' or value == '二年级' or value == '三年级'):
raise serializers.ValidationError("年级输入错误!")
使用:
>>> from demo.serializers import ClassInfoSerializer
>>> data = {
'grade': '四年级'}
>>> serializer = ClassInfoSerializer(data=data)
结果:
(3)validate
如果需要同时对多个字段进行比较验证时,可以定义validate方法来验证,代码修改如下:
class ClassInfoSerializer(serializers.Serializer):
"""班级数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
number = serializers.IntegerField(label='班级编号', required=False)
grade = serializers.CharField(label='年级', max_length=3, required=False)
studentinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 添加
def validate(self, attrs):
number =attrs['number']
grade = attrs['grade']
if number > 10:
raise serializers.ValidationError("number不能大于10")
if not (grade == '一年级' or grade == '二年级' or grade == '三年级'):
raise serializers.ValidationError("年级输入错误!")
使用:
(InteractiveConsole)
>>> from demo.serializers import ClassInfoSerializer
>>> data = {
'number': 11, 'grade': '四年级'}
>>> serializer = ClassInfoSerializer(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{
'non_field_errors': [ErrorDetail(string='number不能大于10', code='invalid')]}
>>> data = {
'number': 5, 'grade': '四年级'}
>>> serializer = ClassInfoSerializer(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{
'non_field_errors': [ErrorDetail(string='年级输入错误!', code='invalid')]}
二、保存
如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现(在序列化器类里面添加)。添加代码如下:
def create(self, validated_data):
"""新建"""
return ClassInfo.objects.create(**validated_data)
def update(self, instance, validated_data):
"""更新,instance为要更新的对象实例"""
instance.number = validated_data.get('number', instance.number)
instance.grade = validated_data.get('grade', instance.grade)
instance.save()
return instance
实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法返回一个数据对象实例了。
如果创建序列化器对象的时候,传递data数据的时候,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。
使用:
添加:
>>> from demo.serializers import ClassInfoSerializer
>>> data = {
'number': 2, 'grade': '三年级'}
>>> serializer = ClassInfoSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<ClassInfo: ClassInfo object (4)>
结果:
在navicat中查看确实添加了数据
更新:
>>> from demo.models import ClassInfo
>>> Class_data = ClassInfo.objects.get(id=2)
>>> data = {
'number': 3, 'grade': '三年级'}
>>> serializer = ClassInfoSerializer(Class_data, data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<ClassInfo: ClassInfo object (2)>
结果:
在navicat中查看确实更新了数据
下一章:DRF学习笔记(三):模型类序列化器ModelSerializer
边栏推荐
- Spark 3.0 adaptive execution code implementation and data skew optimization
- C语言:自定义类型
- Alibaba's latest summary 2022 big factory interview real questions + comprehensive coverage of core knowledge points + detailed answers
- Complexity analysis
- CAS compares the knowledge exchanged, ABA problems, and the process of lock upgrading
- leetcode-1:两数之和
- Zhaoqi scientific innovation and entrepreneurship competition planning and undertaking organization, mass entrepreneurship and innovation platform, project landing and docking
- synchronized和ReentrantLock的区别
- JS uses extension operators (...) to simplify code and simplify array merging
- 【云享读书会第13期】音频文件的封装格式和编码格式
猜你喜欢

/Dev/loop1 takes up 100% of the problem

低代码是开发的未来吗?浅谈低代码平台

Using Lombok results in the absence of parent class attributes in the printed toString
![[TensorBoard] OSError: [Errno 22] Invalid argument处理](/img/bf/c995f487607e3b307a268779ec1e94.png)
[TensorBoard] OSError: [Errno 22] Invalid argument处理

【剑指offer】面试题41:数据流中的中位数——大、小堆实现

折半查找
![[sword finger offer] interview question 54: the k-largest node of the binary search tree](/img/13/7574af86926a228811503904464f3f.png)
[sword finger offer] interview question 54: the k-largest node of the binary search tree

Analysis of spark task scheduling exceptions

Network principle (1) - overview of basic principles

The difference between synchronized and reentrantlock
随机推荐
【剑指offer】面试题46:把数字翻译成字符串——动态规划
Spark RPC
The method of exchanging two numbers in C language
[regular expression] matching grouping
禁令之下,安防巨头海康与大华的应对之策!
leetcode-1:两数之和
Talk about the index of interview questions
C language: minesweeping games
Use double stars instead of math.pow()
Go language slow start -- go operator
JS uses unary operators to simplify string to number conversion
C language: dynamic memory function
【剑指offer】面试题53-Ⅰ:在排序数组中查找数字1 —— 二分查找的三个模版
[sword finger offer] interview question 54: the k-largest node of the binary search tree
QT (XIII) qchart drawing line chart
[系统编程] 进程,线程问题总结
文字批量替换功能
Multimap case
JS operation DOM node
QT (IV) mixed development using code and UI files