RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查
Posted 运维-大白同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查相关的知识,希望对你有一定的参考价值。
定义
Django REST framework (简称 DRF) 是一个强大灵活的wb api工具 功能完善,可快速开发api平台
官网地址
https://www.django-rest-framework.org/
安装要求
pip3 install django==3.2
pip3 install djangorestframework
1.0 使用drf实现用户的增删改查
1.创建app
2.定义数据模型并同步数据库
3.编写序列化器文件
4.编写视图
5.添加api路由
1.1修改settings.py文件
1.2 创建一个app
python3 manage.py startapp myapp_api
1.3 定义数据模型并同步(models.py)
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=30)
city = models.CharField(max_length=30)
sex = models.CharField(max_length=30)
age = models.IntegerField()
python3 manage.py makemigrations #同步数据
python3 manage.py migrate #迁移数据
1.4 编写序列化器文件(serializers.py)
from myapp_api.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
1.5 编写视图(views.py)
from rest_framework import viewsets
from .serializers import UserSerializer
from myapp_api.models import User
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all() #指定操作的数据库
serializer_class = UserSerializer #指定序列化器
1.6添加路由api
1.6.1 主路由
1.6.2 app路由
from django.urls import path, include
from myapp_api import views
from rest_framework import routers
#自动注册路由
router = routers.DefaultRouter()
router.register(r'user',views.UserViewSet)
urlpatterns = [
path('api/', include(router.urls)), #类视图
]
1.7 验证
http://127.0.0.1:8000/myapp_api/api/
post请求验证
get请求验证
put请求验证(更新)更新年龄35
delete请求验证
最终实现数据的增删改查功能!!!
2.0 python 三种常用的序列化方式
2.1 JSON模块
序列化应用场景:用ORM查询数据,采用JSON格式api返回数据
反序列化应用场景:从别的api获取数据,在python里处理
2.2 Django内置的JsonResponse模块
JsonResponse模块自动将pthon对象转化为json对象并响应
缺点: 只能序列化,不支持反序列化,不支持将json对象转化成python对象
2.3 django内置serializers模块
serializers是Django内置的一个序列化器,可直接将python QuerySet对象转化成json格式,但是不支持反序列化。
DRF中有个serializers模块专门负责数据的序列化。
序列化器支持的三种类型:
Serializer: `对Model(数据模型)进行序列化,需自动移字段映射`
ModelSerializer: `对Model(数据模型)进行序列化,会自动生成字段和验证规则,默认包含简单的create()和update()方法`
HyperlinkedModelSerializer: `与ModelSerializer类似,只不过使用超链接来便是关系而不是主键ID`
2.3.1 单独使用 Serializer序列化器实现增删改查
第一步(修改serializers.py文件)
from myapp_api.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
#这里字段必须与使用的模型字段对应
id = serializers.IntegerField()
name = serializers.CharField()
city = serializers.CharField()
sex = serializers.CharField()
age = serializers.IntegerField()
第二步编写视图
from rest_framework.views import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response
class UserView(APIView):
def get(self,request):
#获取所有用户
queryset = User.objects.all()
#调用序列化器将queryset对象 转化为json
user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
# .data是获取序列化结果
return Response(user_ser.data)
def post(self,request):
pass
def put(self,request):
pass
def delete(self,request):
pass
第三步编写路由
from django.urls import path, re_path
from myapp_api import views
urlpatterns = [
re_path('^api/user/$', views.UserView.as_view()),
]
第四步 验证
第五步 查询单用户数据
from rest_framework.views import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response
class UserView(APIView):
def get(self, request, id=None):
if id:
#获取单用户
obj = User.objects.get(id=id)
# 调用序列化器将queryset对象 转化为json
user_ser =UserSerializer(obj)
else:
#获取所有用户
queryset = User.objects.all()
#调用序列化器将queryset对象 转化为json
user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
# .data是获取序列化结果
return Response(user_ser.data)
def post(self,request):
pass
def put(self,request):
pass
def delete(self,request):
pass
第六步 创建用户
1.0
def post(self,request):
#调用序列化器将提交的数据进行反序列化
user_ser = UserSerializer(data=request.data) #request.data是用户提交的post数据
if user_ser.is_valid():
#保存数据
user_ser.save()
res = 'code': 200, 'msg': '创建用户成功'
else:
res = 'code':500, 'msg': '创建用户失败,数据格式不正确'
2.0 在序列化类将数据进行重写
第七步 更新用户数据
7.1 编写serializers.py (更新用户数据,重写数据库)
7.2 编写put更新接口
def put(self,request,id=None):
obj = User.objects.get(id=id)
user_ser = UserSerializer(instance=obj,data=request.data)
if user_ser.is_valid():
#保存数据
user_ser.save()
res = 'code': 200, 'msg': '更新用户成功'
else:
res = 'code':500, 'msg': '更新用户失败,数据格式不正确'
return Response(res)
7.3 测试
异常情况测试,格式不对会直接报错
第八步 编写删除用户的接口
def delete(self,request,id=None):
obj = User.objects.get(id=id)
obj.delete()
res = 'code': 200, 'msg': '删除用户成功!'
return Response(res)
删除成功
http://127.0.0.1:8000/myapp_api/api/user/
至此,使用serializers序列化器实现了增删改查的api接口编写测试
序列化:视图ORM查询数据库---> 数据产乳序列化器--->从 .data获取数据--->响应前端
反序列化:获取用户提交数据--->数据传入序列化器--->调用.save保存数据(重写create和update方法)
序列化器常用的方法和属性
serializer.is_valid(): 调用序列化器验证是否通过,传入raise_exception=True可以在验证失败时由DRF响应400异常
serializer.errors:获取反序列化器的错误信息
serializer.data: 获取序列化器返回的数据
serializer.save():将验证通过的数据保存到数据库(ORM操作)
完整的接口如下
from rest_framework.views import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response
class UserView(APIView):
def get(self, request, id=None):
if id:
obj = User.objects.get(id=id) # 获取单用户,调用序列化器将queryset对象 转化为json
user_ser =UserSerializer(obj)
else:
queryset = User.objects.all() ##获取所有用户,调用序列化器将queryset对象 转化为json
user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
return Response(user_ser.data) # .data是获取序列化结果
def post(self,request):
user_ser = UserSerializer(data=request.data) #request.data是用户提交的post数据
if user_ser.is_valid():
user_ser.save()
res = 'code': 200, 'msg': '创建用户成功'
else:
res = 'code':500, 'msg': '创建用户失败,数据格式不正确'
return Response(res)
def put(self,request,id=None):
obj = User.objects.get(id=id)
user_ser = UserSerializer(instance=obj,data=request.data)
if user_ser.is_valid():
user_ser.save()
res = 'code': 200, 'msg': '更新用户成功'
else:
res = 'code':500, 'msg': '更新用户失败,数据格式不正确'
return Response(res)
def delete(self,request,id=None):
obj = User.objects.get(id=id)
obj.delete()
res = 'code': 200, 'msg': '删除用户成功!'
return Response(res)
name 为空
name 不存在
name字段长度超出规定范围
完整的配置
from myapp_api.models import User
from rest_framework import serializers
#自定义验证器函数
def check_sex(data):
if data.startswith('男') or data.startswith('女'):
return data
else:
raise serializers.ValidationError('性别必须是男and女')
class UserSerializer(serializers.Serializer):
#这里字段必须与使用的模型字段对应
id = serializers.IntegerField(
read_only=True #仅用于序列化,反序列化忽略
)
#针对性返回提示信息
name = serializers.CharField(
max_length=20,
error_messages=
"blank": '请输入姓名',
'required': '该字段必填',
'max_length': '字符长度不超过20'
)
city = serializers.CharField()
sex = serializers.CharField(
validators=[check_sex] #调用验证器函数
)
age = serializers.IntegerField(
min_value=16,
max_value=100,
error_messages=
"blank": '请输入姓名',
'required': '该字段必填',
'max_length': '字符长度不超过20',
'min_value': '年龄不小于16',
'max_value': '年龄大于100',
)
def create(self, validated_data): #validated_data提交的数据,重写,拿到的数据入库
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
return User.objects.filter(id=instance.id).update(**validated_data) #批量更新
以上配置都在api接口层面进行控制,分别对每一个提交的数据进行控制
更高级用法(使用钩子)
#局部钩子:针对某个字段验证合法性‘validate_字段名’
def validate_name(self, attrs):
if attrs.startswith('张'):
return attrs
else:
raise serializers.ValidationError('姓名必须以张开头')
#全局钩子,针对全局验证合法性
def validated_data(self,attrs):
from re import findall
if findall('\\d+', attrs.get('city')):
raise serializers.ValidationError('城市不能包含数字')
return attrs
分别对姓名和城市做了具体的限制条件
使用 ModelSerializer 实现增删改查
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
HyperlinkedModelSerualizer序列化器的使用
结果如图所示,id字段编程url字段,自动生成一个链接
总结
DRF序列化器:关联表显示
场景:
一对多:一个项目有多个应用,一个应用只能属于一个项目
多对多:一个应用部署到多台服务器,一个服务器部署多个应用
以上是关于RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查的主要内容,如果未能解决你的问题,请参考以下文章