djangorestframework简单使用
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 models
class 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 UserModelSerializer(ModelSerializer):
class Meta:
model = User # 指定序列的模型表
fields = "__all__" # 序列化该表中所有字段
书写API
下面就开始书写API
了,API
统一采用CBV
的形式进行书写。
from django.shortcuts import render
from .models import User
from .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 url
from django.contrib import admin
from rest_framework.routers import DefaultRouter # 导入drf的默认路由
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
router = DefaultRouter() # 处理视图的路由器
router.register("user",views.Users) # 注册视图集
urlpatterns.extend(router.urls) # 路由合并
可能的问题
如果你链接的是mysql
数据库,可能会提示你的pymysql
版本问题。
此时只需要在项目全局文件夹下的__init__.py
文件中,添加下面三句代码:
import pymysql
pymysql.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,也必须传入完整的
# "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
后,一个接口,三行代码就可以完整增删改查等操作。
十分的方便。