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')
风月都好看,人间也浪漫.