drf学习第二天
- drf装好了,我们去settings里配置一下
- 先创建一个应用app01
- 发现可以手动创建用户信息
- 只有学生姓名,我想展示多条数据怎么办
- 看到效果了吧
- 也可以加一个批量管理功能
- 接下来把数据库改成mysql的
- 先去mysql数据库创建一个drf01库
- 接着在settings配置文件里配置一下
- 安装一下pymysql
- 去__init__文件下配置一下pymysql
- 执行数据库同步指令发现报字符错误
- 加上这句话就可以了
- 为了展现drf的强大,我们再创建一个应用student
- 别忘了在settings里注册一下应用
- 在student下创建urls.py文件
- 在总路由里使用路由分发
- 在student下创建serializer.py文件
- student/views.py写上视图逻辑,然后运行项目
- 通过浏览器访问student应用的视图函数,发现是一个空的列表
- 那怎么样才能让它有数据呢,使用admin
- 之前创建超级用户是存在了sqlite3数据库里面去了,我们更换了mysql数据库,还需要创建一次超级用户
- 我们再访问admin管理系统,并添加几条数据
- 好,添加完成了,然后我们再去浏览器访问刚才的地址,发现有数据了
- 我们刚才添加的学生名字不是中文的吗,但是默认不显示中文,我们再加上这条数据试试看
- 是不是显示中文了
- 然而还有更牛逼的写法,drf能让一个接口实现增删改查
- 先改写views里的代码
- 这个路径咱们不要了
- 写上如下代码
- 再访问刚才的路径
- 看到了吧,这是drf给我们提供的可视化接口页面
- 也可以只看json数据,在url后面加上?format=json
- 试试用可视化接口页面来添加数据
- 根据接口规范,发送post请求,浏览器应该返回给客户端添加的数据
- 我们把页面再刷新一下,刚才添加的记录也在里面了
- 也可以通过json数据格式提交
- 我想查看某条记录,就在url后面写上id值
- 可以在查询页下面直接修改该条记录的数据,修改好了点击put
- 删除的话告诉浏览器要删除记录的id,在url后面写上id值,查询到了然后直接有按钮删除
- 204状态码是对数据进行删除操作的表现
- 然后我们再刷新页面,看看有没有id为1的记录的数据
- drf提供了五种接口,查看所有数据,查看单条数据,然后是增删改
- 我们再创建一个应用玩一下序列化器
- 别忘了注册一下应用
- ser/models.py代码
- 执行数据库同步指令
- 给新创建的表手动创建两条记录
- ser/serializers.py代码
- 接下来在ser应用下创建一个urls.py
- 在总路由里配置一下路径
- ser/views代码
- 运行项目通过浏览器访问一下ser/students
- 后台打印显示序列化后的数据是个有序字典
- 有些同学会问了,定义序列化器类和字段多麻烦,其实不然,麻烦也有麻烦的好处,比如我注释掉一个序列化字段,name前端就不展示这条记录
- 发现没有age这条记录了,这是最基础的序列化器的简单使用
- 还可以序列化单条记录的数据
- 返回一个字典数据,这也是符合我们接口规范的
- 接下来我们写反序列化
- 先写个序列化器
- 写上视图逻辑
- 把csrf注释了,不然会报403错误
- 用postman测试一下接口发现校验失败
- 可是明明反序列化要的字段都填上去了,为什么还校验失败呢,我们打印一下request.POST,看看有没有数据请求到后端
- 再访问一下接口,然后看后台打印的数据,发现是个空的字典
- 好了原因是由于用户提交的数据可能是json数据,django解析不了,所以我们借助drf来解析,就需要继承drf的APIView类
- 然后我们打印request.data
- 再访问一下接口,发现已经有数据打印出来了,而且报的错误是我们提交的name字段的数据长度错误
- 改一下提交的name字段长度,再访问一下接口
- 已经回复JsonResponse响应数据了,我们再看看后端打印了什么
- 是不是一个一个的queryset类型数据,说明已经符合存入数据库的条件了
- 补充一点,反序列化每个字段默认都是required=True,就是你这个字段必须要传给我,想要不传这个字段需要在反序列化的字段参数上加上required=False
- 发现可以不传这个字段也能通过校验了
- 现在又有个问题来了,比如id字段序列化阶段我们需要给用户展示,但是反序列化阶段用户提交数据又不需要传,那这个时候我们只需要在id字段后加上一个参数叫read_only=True,表明该字段仅用于序列化输出,默认是False
- 我们再写一个序列化器用于序列化和反序列化
- 再测试一下接口,先发送GET请求看看能不能序列化
- 可以的没有问题,而且给我们返回了id值
- 再试试反序列化,这次我们没有传id值,看看行不行
- 看看后台打印结果
- OK,没有问题
- 这下一个序列化器完成序列化和反序列化功能了
- 如果想让一个字段在序列化阶段不会提取出来,但是反序列化阶段必须传入,那么就在字段的后面加上一个参数write_only=True
- 测试一下接口,序列化后发现没有将description字段提取出来展示
- 反序列化,不传description试试
- 提示校验失败
- 再看看后台打印了什么
- required=True和write_only=True共同点:字段数据反序列化阶段必须要传过来,不同点:write_only=True序列化阶段字段数据不会提取出来,required=True序列化阶段字段数据可以被提取出来
drf装好了,我们去settings里配置一下
先创建一个应用app01
把app01添加到应用中
在models.py里写上模型类
class Student(models.Model):
# 模型字段
name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')
sex = models.BooleanField(default=1,verbose_name="性别")
age = models.IntegerField(verbose_name="年龄")
class_null = models.CharField(max_length=5,verbose_name="班级编号")
description = models.TextField(max_length=1000,verbose_name="个性签名")
class Meta:
db_table="tb_student"
verbose_name = "学生"
verbose_name_plural = verbose_name
执行数据库同步指令
python manage.py makemigrations
python manage.py migrate
接下来我们创建一个超级用户
在浏览器中输入http://127.0.0.1:8000/admin进入后台管理系统登录页面
在app01/admin.py里注册一下我们的模型,然后重新运行项目
后台系统页面刷新一下出现了我们创建的表
发现可以手动创建用户信息
添加完成发现展示的是一个学生对象,怎么样让它显示学生名称啊,加一个函数__str__
只有学生姓名,我想展示多条数据怎么办
看到效果了吧
也可以加一个批量管理功能
接下来把数据库改成mysql的
先去mysql数据库创建一个drf01库
接着在settings配置文件里配置一下
安装一下pymysql
去__init__文件下配置一下pymysql
执行数据库同步指令发现报字符错误
加上这句话就可以了
为了展现drf的强大,我们再创建一个应用student
别忘了在settings里注册一下应用
在student下创建urls.py文件
在总路由里使用路由分发
在student下创建serializer.py文件
student/views.py写上视图逻辑,然后运行项目
通过浏览器访问student应用的视图函数,发现是一个空的列表
那怎么样才能让它有数据呢,使用admin
之前创建超级用户是存在了sqlite3数据库里面去了,我们更换了mysql数据库,还需要创建一次超级用户
我们再访问admin管理系统,并添加几条数据
好,添加完成了,然后我们再去浏览器访问刚才的地址,发现有数据了
我们刚才添加的学生名字不是中文的吗,但是默认不显示中文,我们再加上这条数据试试看
是不是显示中文了
然而还有更牛逼的写法,drf能让一个接口实现增删改查
先改写views里的代码
这个路径咱们不要了
写上如下代码
再访问刚才的路径
看到了吧,这是drf给我们提供的可视化接口页面
也可以只看json数据,在url后面加上?format=json
试试用可视化接口页面来添加数据
根据接口规范,发送post请求,浏览器应该返回给客户端添加的数据
我们把页面再刷新一下,刚才添加的记录也在里面了
也可以通过json数据格式提交
我想查看某条记录,就在url后面写上id值
可以在查询页下面直接修改该条记录的数据,修改好了点击put
删除的话告诉浏览器要删除记录的id,在url后面写上id值,查询到了然后直接有按钮删除
204状态码是对数据进行删除操作的表现
然后我们再刷新页面,看看有没有id为1的记录的数据
drf提供了五种接口,查看所有数据,查看单条数据,然后是增删改
我们再创建一个应用玩一下序列化器
别忘了注册一下应用
ser/models.py代码
class Student(models.Model):
# 模型字段
name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')
sex = models.BooleanField(default=1,verbose_name="性别")
age = models.IntegerField(verbose_name="年龄")
class_null = models.CharField(max_length=5,verbose_name="班级编号")
description = models.TextField(max_length=1000,verbose_name="个性签名")
执行数据库同步指令
给新创建的表手动创建两条记录
创建一个序列化器serializers.py
ser/serializers.py代码
from rest_framework import serializers
class StudentSerializers(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
sex = serializers.BooleanField()
age = serializers.IntegerField()
class_null = serializers.CharField()
description = serializers.CharField()
接下来在ser应用下创建一个urls.py
在总路由里配置一下路径
ser/views代码
from django.shortcuts import render
from django.views import View
from ser import models
from ser.serializers import StudentSerializers
from django.http import JsonResponse
# Create your views here.
class StudentsView(View):
def get(self,request):
students = models.Student.objects.all()
serializer_obj = StudentSerializers(instance=students, many=True)
print(serializer_obj.data,type(serializer_obj.data))
return JsonResponse(serializer_obj.data, safe=False, json_dumps_params={'ensure_ascii':False})
运行项目通过浏览器访问一下ser/students
后台打印显示序列化后的数据是个有序字典
有些同学会问了,定义序列化器类和字段多麻烦,其实不然,麻烦也有麻烦的好处,比如我注释掉一个序列化字段,name前端就不展示这条记录
发现没有age这条记录了,这是最基础的序列化器的简单使用
还可以序列化单条记录的数据
返回一个字典数据,这也是符合我们接口规范的
接下来我们写反序列化
先写个序列化器
写上视图逻辑
把csrf注释了,不然会报403错误
用postman测试一下接口发现校验失败
可是明明反序列化要的字段都填上去了,为什么还校验失败呢,我们打印一下request.POST,看看有没有数据请求到后端
再访问一下接口,然后看后台打印的数据,发现是个空的字典
好了原因是由于用户提交的数据可能是json数据,django解析不了,所以我们借助drf来解析,就需要继承drf的APIView类
然后我们打印request.data
再访问一下接口,发现已经有数据打印出来了,而且报的错误是我们提交的name字段的数据长度错误
改一下提交的name字段长度,再访问一下接口
已经回复JsonResponse响应数据了,我们再看看后端打印了什么
是不是一个一个的queryset类型数据,说明已经符合存入数据库的条件了
补充一点,反序列化每个字段默认都是required=True,就是你这个字段必须要传给我,想要不传这个字段需要在反序列化的字段参数上加上required=False
发现可以不传这个字段也能通过校验了
现在又有个问题来了,比如id字段序列化阶段我们需要给用户展示,但是反序列化阶段用户提交数据又不需要传,那这个时候我们只需要在id字段后加上一个参数叫read_only=True,表明该字段仅用于序列化输出,默认是False
我们再写一个序列化器用于序列化和反序列化
在视图中使用该序列化器