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_第1张图片

还有旁边的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/', views.findStuBySid, name='stuBySid'),

三、运行效果

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

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

你可能感兴趣的:(django3入门,hualinux,django,django,drf,drf改连接mysql,drf例子,drf编写一般步骤)