Loading

5.编写序列化类

一、序列化定义
序列化:序列化器会把模型对象转换成字典,经过response认证后变成json字符串
反序列化:把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典变成模型
 
 
增:校验请求数据 -> 执行反序列化过程 ->保存数据库 - > 将保存的对象序列化并返回
删:判断要执行的数据是否存在- >执行数据库删除
改:判断要修改的数据是否存在 - >校验请求的数据 - >执行反序列化过程 ->保存数据库 - > 将保存的对象序列化并返回
查: 查询数据库 - > 将数据序列化并返回
 
二、编写序列化器
开发Web API的第一件事是为我们的代码片段对象创建一种序列化和反序列方法,将其与诸如
json 格式进行互相转换。具体方法是声明与Django forms非常相似的序列化器(serializers)
来实现。 在 应用 的目录下创建一个名为 serializers.py 文件,并添加以下内容
 
1.在应用下创建序列化模块,例如serializer.py (名字自定义)
2.在该py下创建序列化器及需要返回的序列化字段,与要返回models字段对应
PS:为每一个你需要序列化的model创建一个序列化类
#models 设计
from django.db import models

# 处理代码高亮的包
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

# 代码高亮风格,不用关注
LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())

# Snippet模型类型
class Snippets(models.Model):
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Mate:
        # 根据created排序
        ordering = ('',)
# -*- coding: utf-8 -*-
# @Time:     2022/1/16 23:05
# @Author:   LiQi
# @Describe:
from rest_framework import serializers
from snippets.models import *


# 定义Snippet序列化类,继承serializers.Serializer
# 序列化类、方法里面定义了的字段会返回,没有定义的代表不需要序列化,不会返回
class SnippetSerizlizer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)  # 序列化时使用,反序列化时不用
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    #创建数据
    def create(self, validated_data):
        # 使用验证后的数据,创建一个代码片段对象。使用的是Django的ORM的语法。
        # 前端post过来的数据,利用序列化器,往model里面创建一个新的代码片段
        # **validated_data代表已经经过验证的字典数据
        return Snippet.objects.create(**validated_data)  # ORM的api,创建新代码片段

    #更新数据
    # 使用验证过的数据,更新并返回一个已经存在的‘代码片段’对象。依然使用的是Django的 ORM的语法
    def update(self, instance, validated_data):
        '''
        :param instance: 要更新的实例
        :param validated_data: 要更新成什么内容
        :return: 
        '''
        instance.title = validated_data.get('title', instance.title)
        '''
        validated_data.get 获取要更新的值
        如果获取到了,赋值给 instance.title
        如果没有找到,instance.title保持原样
        '''
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance
三、ModelSerializer
# 序列化类,继承serializers.ModelSerializer
# 节省类很多代码,但是有自己的一套规则,降低了可定制性,取决于业务场景
class SnippetSerializer(serializers.ModelSerializer):
    '''
    也可以直接指定字段
    例如 id = serializers.IntegerField(read_only=True)
    '''
    
    # 直接编写元类
    class Meta:
        # 使用哪个模型类
        model = Snippet
        # 该模型类要序列化哪些字段,可以是元组或者列表,有默认实现的create和update
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

 

posted @ 2022-04-29 19:13  木子七  阅读(67)  评论(0编辑  收藏  举报