djangorestframework简单使用

djangorestframework

   该模块是Django在对FrameWork规范的一种支持,可以让我们快速的编写出符合FrameWork规范的接口。

   使用pip命令进行安装,如提示安装失败可查询djangorestframeworkDjango版本的对应关系,如果你使用旧版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后,一个接口,三行代码就可以完整增删改查等操作。

   十分的方便。

posted @ 2020-10-23 18:20  云崖先生  阅读(357)  评论(0编辑  收藏  举报