3. 普通序列化 serializers


接上编文章 创建app02

  • 记得settings添加应用
django-admin startapp app02

模型 models

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(verbose_name='标题',max_length=100)
    vum = models.IntegerField(verbose_name='浏览量')
    content = models.TextField(verbose_name='内容')

数据库迁移

# 迁移数据库
python manage.py makemigrations
# 同步
python manage.py migrate

序列化

  • 新建serializers.py文件
from rest_framework import serializers

from .models import Article


# 普通序列化
class ArticleSerializer(serializers.Serializer):
    # 参数约束
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(max_length=100,required=True)
    vum = serializers.IntegerField(required=True)
    content = serializers.CharField()


    def create(self, validated_data):
        """
        根据已验证的数据,创建并返回一个新的' Snippet '实例。
        """
        return Article.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        根据已验证的数据,更新并返回一个现有的' Snippet '实例。
        """
        instance.title = validated_data.get('title', instance.title)
        instance.vum = validated_data.get('vum', instance.vum)
        instance.content = validated_data.get('content', instance.content)

        instance.save()
        return instance

  • 参数约束
read_only: True表示不允许用户自己上传,只能用于api的输出。
write_only: 与read_on1y对应
required:顾名思义,就是这个字段是否必填。
allow_nu11/allow_blank:是否允许为NULL/空。
validators:自定义验证逻辑

error_messages: 出错时,信息提示。
name = serializers.CharField(required=True, min_1ength=6,
    error_messages={
        'min_1ength': '名字不能小于6个字符',
        'required': '请写名字'}) 

终端 进入 Django shell。

python manage.py shell

利用反序列化生成模型对象

from app02.serializers import ArticleSerializer
d = {'title':"我是标题","vum":1231,"content":"我是内容"}
ser = ArticleSerializer(data=d)
ser.is_valid() #校验数据是否正确
ser.save() #保存数据

把模型序列化json数据

from app02.models import *
from rest_framework.renderers import JSONRenderer
arts = Article.objects.all()
ser = ArticleSerializer(instance=arts,many=True) # many=True 序列化多个对象
ser.data #查看序列化好的数据
json_data = JSONRenderer().render(ser.data) #把模型序列化json数据
json_data #就是我们序列化好的json数据

# 测试序列化一个
arts = Article.objects.get(id=1)
ser = ArticleSerializer(instance=arts) 
ser.data #查看序列化好的数据
json_data = JSONRenderer().render(ser.data) #把模型序列化json数据
json_data #就是我们序列化好的json数据

总结

序列化
    把模型数据转成可传输的数据叫序列化
反序列化
    把可传输的数据转成模型数据叫反序列化

当序列化的时候如果是多个数据需要加many=True,单个对象不需要。
当我们序列化的时候,要用关键字instance,或者不用
ser = ArticleSerializer(instance=arts,many=True)
ser = ArticleSerializer(instance=arts) 

当我们反序列化的时候要用data关键字
ser = ArticleSerializer(data=d)