0
点赞
收藏
分享

微信扫一扫

hualinux dj3 2.3:使用drf改写django连接mysql


目录

​​一、django用drf改写思路​​

​​二、重构django代码​​

​​2.1 django安装及配置​​

​​2.2 创建drf序列化​​

​​2.3 使用视图集APIView​​

​​2.4 添加url映射​​

​​三、运行效果​​

此篇对《​​连接mysql8.0数据库​​》编写成json的项目改写成drf方式。

需要的知识点,是drf官方教程tutorial所有内容。

hualinux dj3 2.3:使用drf改写django连接mysql_drf编写一般步骤

还有旁边的api导读(API Guide)中的视图相关

一、django用drf改写思路

把普通的django返回的json变成drf方式思路如下:

1. 序列化serializers:我们使用drf框架中的序列化serializers,而不是django的,主要是把python数据类型转为json

2.视图APIView视图集viewsets:drf使用的是基于类的视图,我这里先使用apiView中的​​@api_view()​​修饰器,写在函数顶部,表示这是一个drf的APIView而不是django的view.

3.url配置路由route:这个功能主要是关联类(视图集),而django是的url则是联系到函数。

我这里使用的是函数,并不是类,所以没有用到route。

4.其它,权限之类我没添加,去掉。​​分页功能​​是可选的,我添加了。

二、重构django代码

使用了drf框架对之前《​​连接mysql8.0数据库​​》进行重写,操作如下:

2.1 django安装及配置

安装及配置是按照《​​django REST framework(drf)的安装​​》进行安装的,我这里不不再详说了。

2.2 创建drf序列化

我在app中创建一个名为serializers.py文件,内容如下:

from rest_framework import serializers
from app.models import Stu


class StudentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=Stu
fields = '__all__'

如果你不懂可以 查看教程的​​序列化​​​部分 或​​API导读序列化​​中的ModelSerializers部分。

2.3 使用视图集APIView

REST framework提供了一个APIView类,它是Django的View类的子类。

APIView类和一般的View类有以下不同:

  • 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。
  • 处理方法可以返回REST framework的Response,而不是Django的HttpRequest。视图会管理内容协议,给响应设置正确的渲染器。
  • 任何APIException异常都会被捕获,并且传递给合适的响应。
  • 进入的请求将会经过认证,合适的权限和(或)节流检查会在请求被派发到处理方法之前运行。

使用APIView类和使用一般的View类非常相似,通常,进入的请求会被分发到合适处理方法比如.get(),或者.post。另外,很多属性会被设定在控制API策略的各种切面的类上。

app/views.py代码修改如下:

import json
from rest_framework.decorators import api_view
from app.models import Stu
from app.serializers import StudentSerializer

@api_view()
def findStuBySid(request, stuSid):
querysets = Stu.objects.filter(sid=stuSid)
# 可以序列化查询结果集(querysets)而不是模型实例。
# 我们只需要为serializer添加一个many=True标志。
serializer = StudentSerializer(querysets, many=True)
# 结果为有序列字典,只有一个结果,所以取第1个
#[{"id": 11, "sid": "011", "name": "fly", "yuWen": "90.0", "shuXue": "89.0"}]
res = json.dumps(serializer.data[0])
return HttpResponse(res)

上面中用到的是结果集,所以要用到many=Ttrue,如果我们只查一条记录,其实可以使用get的,所以我修改一下,代码变成:

@api_view()
def findStuBySid(request, stuSid):
querysets = Stu.objects.get(sid=stuSid)
# 可以序列化查询结果集(querysets)而不是模型实例。
# 我们只需要为serializer添加一个many=True标志。
serializer = StudentSerializer(querysets)
res = json.dumps(serializer.data)
print(serializer.data)
return HttpResponse(res)

2.4 添加url映射

app/urls.py添加内容

path('sid/<str:stuSid>', views.findStuBySid, name='stuBySid'),

三、运行效果

运行django,在浏览器中输入 ​​http://127.0.0.1:8000/sid/001​​,效果如下:

hualinux dj3 2.3:使用drf改写django连接mysql_drf编写一般步骤_02

PS:最后没有反斜杠的,不能写成 ​​http://127.0.0.1:8000/sid/001/​​,否则会报404

举报

相关推荐

0 条评论