3-1 序列化-DRF普通序列化-Serializer
目录:
- 简介
- 序列化生产JSON数据、反序列化生产模型对象
- 场景使用
一、简介
serializers.Serializer 是最普通的序列化类,在序列化类中,每一个字段都需要自己定义,而且序列化类中定义的字段名必须跟model中的一致。
我们这边为了方便测试,我们新建一个 app02,来做测试:=> 千万别忘了,在settings.py的INSTALL_APP = ["app02"]
>python manage.py startapp app02
目录结构我就不说了,在快速入门里面我已经写了。
1.1、模型类
说明:创建模型类,编辑 app02 -> models.py
from django.db import models
class Article(models.Model):
title = models.CharField(verbose_name='标题', max_length=100)
vum = models.IntegerField(verbose_name='浏览量')
content = models.TextField(verbose_name='内容')
1.2、序列化
说明:创建序列化文件serializers.py,即:app02->serializers.py。
serializers.Serializer:由于是最普通的,也很少用,字段和创建和更新数据都需要自己自定义。
from rest_framework import serializers
from .models import Article
#普通序列化,很少用
class ArticleSerializer(serializers.Serializer): #最普通的序列化类,需要对Article类的每一个字段都需要自己定义,定义的字段必须跟Article类一样
id = serializers.IntegerField(read_only=True) #id是Article类中自主生产的,而不是传过去的,所以我们定义为只读
vum = serializers.IntegerField(required=True)
content = serializers.CharField(max_length=1000)
title = serializers.CharField(required=True, max_length=100)
def create(self, validated_data): #validated_data表示传递过来的数据
return Article.objects.create(**validated_data) #保存数据
def update(self, instance, validated_data): #instance:传递过来的实例,就是 model实例,validated_data传递过来的数据,
instance.title = validated_data.get('title', instance.title) #instance:表示Article实例,validated_data传递过来的数据
instance.vum = validated_data.get('vum', instance.vum) #get('vum', instance.vum):表示没有取到就用原来的值
instance.content = validated_data.get('content', instance.content)
instance.save()
return instance
1.3、参数约束
read_only:True表示不允许用户自己上传,只能用于api的输出。
write_only: 与read_only对应,表示只能传递过来,不能自动生成
required: 顾名思义,就是这个字段是否必填。
allow_null/allow_blank:是否允许为NULL/空 。
error_messages:出错时,信息提示。
name = serializers.CharField(required=True, min_length=6,
error_messages={
'min_length': '名字不能小于6个字符',
'required': '请填写名字'})
label: 字段显示设置,如 label=’验证码’
help_text: 在指定字段增加一些提示文字,这两个字段作用于api页面比较有用
style: 说明字段的类型,这样看可能比较抽象,看下面例子:
# 在api页面,输入密码就会以*显示
password = serializers.CharField(
style={'input_type': 'password'})
# 会显示选项框
color_channel = serializers.ChoiceField(
choices=['red', 'green', 'blue'],
style={'base_template': 'radio.html'})
validators:自定义验证逻辑
二、反序列化生产模型对象、序列化生产JSON数据
2.1、利用反序列化生产模型对象
说明:ser.is_valid() => 当我们反序列化的时候,会帮我们校验数据是否合法;当我们反序列化的时候,要用data关键字。
D:\PycharmProjects\drf_test>python manage.py shell #终端调试
>>> from app02.serializers import ArticleSerializer
#成功案例
>>> d = {'title':"tom is very handsome",'vum':11,'content':'that is very right'} #输入正确的序列化,跟ArticleSerializer定义字段匹配
>>> ser = ArticleSerializer(data=d) #反序列化
>>> ser.is_valid() #验证 反序列化是否成功
True
>>>ser.save() # 成功后保存数据,到Article表中查询,是存在d这条数据
#失败案例
>>> d = {"title":'shuaigaogao hen shuai','vum':12} #输入错误的 序列化数据,跟ArticleSerializer定义字段不匹配
>>> ser = ArticleSerializer(data=d)
>>> ser.is_valid() # 序列化失败
False
2.2、利用序列化生成JSON数据
说明: 当序列化的时候,如果是多个数据,需要加 many=True,单个对象不需要;当我们序列化的时候,要不用关键instance,或者不用。
D:\PycharmProjects\drf_test>python manage.py shell #终端调试
>>> from rest_framework.renderers import JSONRenderer #渲染序列后生成的JSon格式数据
>>> from app02.serializers import ArticleSerializer
>>> from app02.models import Article
#单个对象
>>> art = Article.objects.get(id=1) #单个对象
>>> ser = ArticleSerializer(art) #序列化单个实例,也可以用关键字:ArticleSerializer(instance=art)
>>> ser.data
{'id': 1, 'vum': 11, 'content': 'that is very right', 'title': 'tom is very handsome'}
>>> json_data = JSONRenderer().render(ser.data) #返回序列化数据
>>> json_data
b'{"id":1,"vum":11,"content":"that is very right","title":"tom is very handsome"}'
#多个对象
>>> art = Article.objects.all() #多个序列化对象
>>> ser = ArticleSerializer(art,many=True) #如果多个对象序列化 需要加many,告诉它有对个序列化对象
>>> ser.data
[OrderedDict([('id', 1), ('vum', 11), ('content', 'that is very right'), ('title', 'tom is very handsome')])]
>>> json_data = JSONRenderer().render(ser.data)
>>> json_data
b'[{"id":1,"vum":11,"content":"that is very right","title":"tom is very handsome"}]'

浙公网安备 33010602011771号