django REST framework-序列化器
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
安装
- 安装包
pip install djangorestframework
- 安装到项目
还需要在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方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)