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"}]'

 

posted @ 2020-04-22 15:58  帅丶高高  阅读(494)  评论(0)    收藏  举报