上一篇说了使用Django传统写CRUD的痛点,那么现在就说解决这些痛点的方法
Django REST framework
- 简称为DRF框架或者REST freamwork框架
- 是在Django框架的基础上,进行二次开发的
- 适用于构建符合RESTful风格的API
一、特性
- 提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作
- 提供了丰富的类视图、Mixin扩展类、ViewSet视图集
- 强大的排序,过滤,分页,搜索,限流等功能
- 多种身份权限认证
= 可扩展性,插件丰富 - 提供了直观的Web API界面
二、序列化器
数据校验
- 判断用户输入的数据是否异常
数据转换
-
反序列化
前端传入的数据格式(json,xml,text)=>程序中的数据类型 -
序列化
程序中的数据类型->数据格式(前端可以处理的数据,如json,xml,text)
三、序列化:
单个结果的查询集
修改上一篇的代码_根据id查询User信息
1.安装
pip install djangorestframework
2.配置
settings.py
的INSTALLED_APPS
中,添加rest_framework
'rest_framework'
3.查询单个结果的结果,使用ID获取项目:
3.1.创建项目序列化器类:
需要序列化输出哪些字段,那么就在序列化器中定义这些字段
新建projects/serializer.py
文件:
from rest_framework import serializers
class ProjectsSerializer(serializers.Serializer):
"""
创建项目序列化器类:需继承Serializer类或其子类
"""
# 和model类的字段进行对比;注意:max_length的位置需注意,并且有些类型是没有这个字段的
# label:相当于verbose_name
# help_text:相当于帮助信息
# max_length:最大长度
# !!下面两个是配对的
# allow_null:相当于null(指定字段非必填,否则是必填)
# allow_blank:相当于blank(指定字段非必填,否则是必填)
#和model中字段可以不一致,需要用就显示哪些
name = serializers.CharField(label='用户名', max_length=128, help_text='用户名' )
leader = serializers.CharField(label="负责人", max_length=50, help_text="负责人")
tester = serializers.CharField(label="测试人员", max_length=50, help_text="测试人员")
programer = serializers.CharField(label="开发人员", max_length=50, help_text="开发人员")
publish_app = serializers.CharField(label="发布应用", max_length=50, help_text="发布应用")
desc = serializers.CharField(label="简要描述", max_length=200, help_text="简要描述")
3.2、在view
的接口中使用序列化器
步骤:
- a.传递查询集给序列化器的
instance
参数,获得序列化器对象 - b.从序列化对象的
data
获取序列化后的dict
类型的数据
例子:修改projects/views.py
中根据id
查询project
信息的接口
def get(self,request,pk):
project = Projects.objects.get(id=pk)
# 1.传递查询集给序列化器,并返回序列化器对象
serializer = ProjectsSerializer(instance=project)
# 2.通过序列化器对象的data属性,获取序列化后的dict
return JsonResponse(serializer.data)
3.3.访问http://127.0.0.1:8886/users/9
4.多个结果的查询集
获取项目列表:
步骤和之前一样,只不过因为需要序列化的内容中包含多个结果的查询集,所以在传递查询集给序列化器处理的时候,需要定义many=True
def get(self,request):
#1>从数据库获取所有项目信息,列表格式
projects_qs = Projects.objects.all()
# 查询集中有多个结果,需要定义many=True
serializer = ProjectsSerializer(instance=projects_qs,many=True)
#JsonResponse第一个参数只能默认为dict字典,如果未其余类型需要修改safe=False
return JsonResponse(serializer.data,safe=False)