首页 > 其他分享 >django REST framework-序列化器

django REST framework-序列化器

时间:2023-02-02 14:56:22浏览次数:41  
标签:serializers instance data REST label framework 序列化 True

django REST framework

简介

构建RESTful风格API的一个基于django的web框架。drf框架,rest framework框架。

特性:

  • 强大的序列化器,可以高效的进行序列化和反序列化操作。
  • 极丰富的类视图,Mixin扩展视图,ViewSet视图
  • 提供了直观的web api界面
  • 支持多种身份认证和权限认证
  • 强大的排序,过滤,分页,搜索,限流等功能。
  • 扩展性强, 插件丰富

依赖

python 3.5-3.9

django 2.2 3.0 3.1 3.2

安装

  1. 安装包
pip install djangorestframework
  1. 安装到项目

还需要在django设置文件中安装到项目

INSTALLED_APPS = [
	...
    'rest_framework'
]

序列化器

drf的核心概念。

drf提供了一个serializer类,它可以非常方便的序列化模型对象和查询集为json或者其他形式的内容。还可以提供反序列化,允许在通过验证传入数据后将解析的数据转换为复杂的类型对象。

定义序列化器

序列化器一般定义在每个应用目录下的serializers.py模块。

from rest_framework import serializers

from .models import Student


class StudentSerializer(serializers.Serializer):
    """
    学生序列化器
    """
    # 定义需要序列化、反序列化的字段
    id = serializers.IntegerField(label='学生id', read_only=True)
    name = serializers.CharField(label='姓名')
    sex = serializers.IntegerField(label='性别', default=1)
    age = serializers.IntegerField(label='年龄', required=False, allow_null=True)
    qq = serializers.IntegerField(label='qq号码', required=False, allow_null=True)
    phone = serializers.IntegerField(label='手机号码', required=False, allow_null=True)
    channel = serializers.CharField(label='渠道', read_only=True)
    c_time = serializers.DateTimeField(label='创建时间', read_only=True)
    
    def create(self, validated_data):
        """
        创建对象时调用
        :param validated_data: 
        :return: 
        """
        return Student.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        """
        更新对象时调用
        :param instance: 
        :param validated_data: 
        :return: 
        """
        for key, value in validated_data.items():
            setattr(instance, key, value)
        
        instance.save()
        return instance

使用序列化器

序列化

obj->json/html

# 配置一下django项目的依赖环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'study_django.settings')
django.setup()

from crm.models import Student
from crm.serializers import StudentSerializer
# 序列化
# 1. 创建一个实例
obj = Student.objects.first()
# 2. 通过序列化器进行序列化
serializer = StudentSerializer(instance=obj)
print(type(serializer.data), serializer.data)
import json
print(json.dumps(serializer.data))

# 3. 还可以序列化查询集
objs = Student.objects.all()
# 序列化查询集的时候,给一个参数many=True
ss = StudentSerializer(objs, many=True)
print(ss.data)

反序列化

json->obj

# 配置一下django项目的依赖环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'study_django.settings')
django.setup()

from crm.serializers import StudentSerializer
from crm.models import Student
data = {
    'name': '心蓝',
    'sex': 1,
    'age': 18,
    'qq': '321123',
    'phone': '1112223333'
}
# data = json.dumps(data)
# 反序列化
# 一、创建对象
# s = StudentSerializer(data=data)
# # 校验
# if s.is_valid():
#     instance = s.save()
#     print(instance)
# else:
#     print(s.errors)

# 二、更新对象
# 1.拿到对象
obj = Student.objects.last()
print(obj.phone)
# 2.反序列化
# 要修改的对象传递给instance参数,数据字典传递给data参数
s = StudentSerializer(instance=obj, data=data)
if s.is_valid():

    instance = s.save()
    print(instance.phone)
else:
    print(s.errors)

# 什么时候序列器调用create,什么时候调用update
# 如果instance存在,那么save的时候调用update,否则就是create

模型序列化器

StudentSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(help_text='姓名', label='姓名', max_length=20)
    age = IntegerField(allow_null=True, help_text='年龄', label='年龄', max_value=32767, min_value=-32768, required=False)
    sex = IntegerField(help_text='性别', label='性别', max_value=32767, min_value=-32768, required=False)
    qq = CharField(allow_blank=True, allow_null=True, help_text='qq号码', label='Qq号码', max_length=20, required=False, validators=[<UniqueValidator(queryset=Student.objects.all())>])
    phone = CharField(allow_blank=True, allow_null=True, help_text='手机号码', label='手机号码', max_length=20, required=False, validators=[<UniqueValidator(queryset=Student.objects.all())>])
    c_time = DateTimeField(label='创建时间', read_only=True)
    channel = PrimaryKeyRelatedField(allow_null=True, help_text='渠道来源', label='渠道', queryset=Channel.objects.all(), required=False)

模型序列化器自动根据模型创建了对应的字段,简单的实现了create和update方法。

标签:serializers,instance,data,REST,label,framework,序列化,True
From: https://www.cnblogs.com/chenxdnote/p/17086003.html

相关文章