djangorestframework
该模块是
Django
在对
FrameWork
规范的一种支持,可以让我们快速的编写出符合
FrameWork
规范的接口。
使用
pip
命令进行安装,如提示安装失败可查询
djangorestframework
与
Django
版本的对应关系,如果你使用旧版
Django
,可尝试降低
djangorestframework
的版本号。
pip install djangorestframework
基本使用
注册drf
当下载完成后,需要在
settings.py
中注册
drf
:
INSTALLED_APPS = [\'app01.apps.App01Config\', # 注册app\'rest_framework\', # 注册drf]
创建模型表
下一步是创建模型表,记得最后要执行的两条命令。
from django.db import modelsclass User(models.Model):user_id = models.AutoField(primary_key=True, verbose_name=\"用户编号\")user_name = models.CharField(max_length=32, verbose_name=\"用户名\")user_gender = models.BooleanField(choices=([0, \"male\"], [1, \"female\"]), verbose_name=\"用户性别\")user_introduction = models.TextField(max_length=1024, null=True, blank=True, verbose_name=\"用户简介\")def __str__(self):return self.user_name# python manage.py makemigrations# python manage.py migrate
序列化类
由于我们的
API
需要将该表中的数据进行返回,返回那些结果就需要用到序列化类。
在
app01
下新建一个任意的
py
文件,开始编辑序列化的规则
from .models import User # 导入模型表from rest_framework.serializers import ModelSerializer # 导入模型序列化class UserModelSerialize56cr(ModelSerializer):class Meta:model = User # 指定序列的模型表fields = \"__all__\" # 序列化该表中所有字段
书写API
下面就开始书写
API
了,
API
统一采用
CBV
的形式进行书写。
from django.shortcuts import renderfrom .models import Userfrom .drf_ser import UserModelSerializer # 引入序列化的类from rest_framework.viewsets import ModelViewSet # ModelViewSet是drf中对View的一层封装,它会自动识别不同的请求方式,如GET、POST等class Users(ModelViewSet):queryset = User.objects.all() # 模型表需要拿出所有数据,内部会自动进行增删改查serializer_class = UserModelSerializer # 序列化后会自动进行返回数据
书写路由
下面就是路由的书写,路由的书写有些不一样的地方,它需要将你的
API
接口单独书写后进行合并。
from django.conf.urls import urlfrom django.contrib import adminfrom rest_framework.routers import DefaultRouter # 导入drf的默认路由from app01 import viewsurlpatterns = [url(r\'^admin/\', admin.site.urls),]router = DefaultRouter() # 处理视图的路由器router.register(\"user\",views.Users) # 注册视图集urlpatterns.extend(router.urlad8s) # 路由合并
可能的问题
如果你链接的是
mysql
数据库,可能会提示你的
pymysql
版本问题。
此时只需要在项目全局文件夹下的
__init__.py
文件中,添加下面三句代码:
import pymysqlpymysql.version_info = (1, 4, 13, \"final\", 0)pymysql.install_as_MySQLdb()
接口测试
获取所有
使用
GET
请求来获取到所有的数据。
http://127.0.0.1:8000/user/
可以发现,它遵循了
framework
设计规范,返回的是一个
Array
嵌套
object
。
[{\"user_id\": 1,\"user_name\": \"用户1\",\"user_gender\": false,\"user_introduction\": \"\"},{\"user_id\": 2,\"user_name\": \"用户2\",\"user_gender\": false,\"user_introduction\": \"\"},{\"user_id\": 3,\"user_name\": \"用户3\",\"user_gender\": true,\"user_introduction\": \"\"}]
获取单个
使用
GET
请求指定获取某一条数据。它会自动查找
pk
为2的记录。
http://127.0.0.1:8000/user/2/
返回结果是一个单纯的
object
:
{\"user_id\": 1,\"user_name\": \"用户1\",\"user_gender\": false,\"user_introduction\": \"\"}
新建用户
使用
POST
请求来新建一个用户。需要修改发送请求的方式为
POST
,并且还需要在
Body
体中添加
JSON
格式的数据。
{\"user_id\": 4,\"user_name\": \"用户4\",\"user_gender\": 1,\"user_introduction\": \"我很难过\"}
由于遵循
framework
设计规范,它会将新增的这一条记录给你返回回来。
{\"user_id\": 4,\"user_name\": \"用户4\",\"user_gender\": 1,\"user_introduction\": \"我很难过\"}
修改用户
修改时可以使用
PUT
,也可以使用
PATCH
。
更推荐使用
PATCH
,因为使用
PUT
你必须将完整的信息传入。
以下示例是使用
PUT
:
http://127.0.0.1:8000/user/1/
这是请求体中的信息,注意现在并没有将完整的资源传过去:
{\"user_name\": \"尝试修改用户1\"}# 完整的应该是这样的# {# \"user_id\": 1,# \"user_name\": \"尝试修改用户1\", # 即使我只修改name,也126a必须传入完整的# \"user_gender\": false,# \"user_introduction\": \"\"# }
当尝试修改,会返回该信息
{\"user_gender\": [\"该字段是必填项。\"]}
如果是使用
PATCH
,则返回信息是这样的,不用传入完整的资源:
{\"user_id\": 1,\"user_name\": \"尝试修改用户1\",\"user_gender\": false,\"user_introduction\": \"\"}
删除用户
尝试修改用户1,使用
delete
请求方式,它没有任何返回值。
http://127.0.0.1:8000/user/1/
使用小结
可以看见,使用
djangorestframework
后,一个接口,三行代码就可以完整增删改查等操作。
十分的方便。