drf学习第二天

drf学习第二天

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

我们再写一个序列化器用于序列化和反序列化

在这里插入图片描述
在视图中使用该序列化器
在这里插入图片描述

再测试一下接口,先发送GET请求看看能不能序列化

在这里插入图片描述

可以的没有问题,而且给我们返回了id值

再试试反序列化,这次我们没有传id值,看看行不行

在这里插入图片描述

看看后台打印结果

在这里插入图片描述

OK,没有问题

这下一个序列化器完成序列化和反序列化功能了

如果想让一个字段在序列化阶段不会提取出来,但是反序列化阶段必须传入,那么就在字段的后面加上一个参数write_only=True

在这里插入图片描述

测试一下接口,序列化后发现没有将description字段提取出来展示

在这里插入图片描述

反序列化,不传description试试

在这里插入图片描述

提示校验失败

再看看后台打印了什么

在这里插入图片描述

required=True和write_only=True共同点:字段数据反序列化阶段必须要传过来,不同点:write_only=True序列化阶段字段数据不会提取出来,required=True序列化阶段字段数据可以被提取出来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值