前言
这个文章,是我学习王进老师的课程的笔记,感谢王进老师。强烈推荐大家去看看王进老师的课程
第一步,安装和注册 Django REST Framework
可以通过 pip 来安装。最好在一个虚拟环境中进行操作,以隔离出您的项目所需的依赖项。
步骤如下:
- 打开终端或命令行界面。
- 进入您的项目虚拟环境。
- 运行以下命令来安装 Django REST Framework:
pip install djangorestframework
- 安装完成后,您需要将它添加到您的项目的 settings.py 文件中的 INSTALLED_APPS 中:
INSTALLED_APPS = [
# ...
'rest_framework',
]
这样,Django REST Framework 就已经被成功安装到您的项目中了。
第二步,增删改查的应用
1、rest的基本规范:
常用的HTTP请求方法有以下几种:
GET:获取资源的信息,可以理解为读取操作。
POST:创建资源,可以理解为写入操作。
PUT:更新资源,可以理解为更新操作。
DELETE:删除资源,可以理解为删除操作。
PATCH:更新资源的部分信息,可以理解为局部更新操作。
2、序列化
序列化,就是将django从数据库中取出的数据对象进行转换。即获取数据时,将对象转化为 json 格式传送给前端;存储时,将 json 格式转化为对象,写入数据中。
在 app 的文件夹中新建 “serializer.py” 文件,并在该文件中写入:
# ==========导入模块===========
from rest_framework import serializers
from studentweb.models import Faculty, Major, Student
# ==========Faculty 序列化类============
class FacultySerializer(serializers.Modelserializer):
class Meta:
model = Faculty
fields = "__all__"
# ==========Major序列化类============
class MajorSerializer(serializers.Modelserializer):
class Meta:
model = Major
fields = "__all__"
# ==========Student序列化类============
class StudentSerializer(serializers.Modelserializer):
class Meta:
model = Student
fields = "__all__"
3、视图
实现后台的核心功能。基于 类 来实现
在views文件中写入:
# ============导入模块==================
from rest_framework.viewsets import ModelViewSet # 封装完成的ModleViewset视图集
from studentweb.models import Faculty, Major, Student # 导入数据类
from studentweb.serializer import FacultySerializer, MajorSerializer, StudentSerializer # 导入序列化的数据类
# ================Faculty视图======================
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerializer
# ================mojer视图======================
class MojerViewSet(ModelViewSet):
queryset = Mojer.objects.all()
serializer_class = MojerSerializer
# ================Student视图======================
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = FacultySerializer
4、路由
在 “urls.py” 文件中配置路由
# =============导入模块===========
from django.urls import path
from rest_framework.routers import DefaultRouter
from studentweb.views import FacultyViewSet, MojerViewSet, StudentViewSet
urlpatterns = []
# ============1.实例化一个DefaultRouter=========
router = DefaultRouter()
# ============2.注册相应的url===================
# 注册 faculty 对象
router.register('facultys', FacultyViewSet, basename='facultys')
# 注册 major对象
router.register('majors', MajorViewSet, basename='majors')
# 注册 student 对象
router.register('students', StudentViewSet, basename='students')
# ============3.附加到urlpatterns集合中=========
urlpatterns += router.urls
第三步,实现筛选
1、安装 django-filter 并注册
可以通过 pip 来安装。最好在一个虚拟环境中进行操作,以隔离出您的项目所需的依赖项。
步骤如下:
- 打开终端或命令行界面。
- 进入您的项目虚拟环境。
- 运行以下命令来安装 Django-filter:
pip install django-filter
- 安装完成后,您需要将它添加到您的项目的 settings.py 文件中的 INSTALLED_APPS 中:
INSTALLED_APPS = [
# ...
'django_filters',
]
这样,Django REST Framework 就已经被成功安装到您的项目中了。
2、完成筛选的类
在 app 的文件夹中,新建一个**“filter.py”**的文件,用来存放筛选的类
在改文件中写入以下内容
# =========导入模块============
from django_filters import FilterSet
from studentweb.models import Faculty, Major, Student # 导入数据类
# ============faculty的filter类========
class FacultyFilter(FilterSet):
class Meta:
model = Faculty
fields = ("name",) # 注意,在元组中,如果只有一个元素,一定要加 “,”,不然会报错
# ============major的filter类========
class MajorFilter(FilterSet):
class Meta:
model = Major
fields = ("name", "faculty")
# ============student的filter类========
class StudentFilter(FilterSet):
class Meta:
model = Student
fields = ("sno", "name", "moble")
3、将筛选类“filter.py”导入到视图(views.py)中
在views文件中写入:
# ============导入模块==================
from rest_framework.viewsets import ModelViewSet # 封装完成的ModleViewset视图集
from studentweb.models import Faculty, Major, Student # 导入数据类
from studentweb.serializer import FacultySerializer, MajorSerializer, StudentSerializer # 导入序列化的数据类
# 以下是新增的
from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
from studentweb.filter import FacultyFilter, MajorFilter, StudentFilter # 导入筛选类
# ================Faculty视图======================
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台,由于这一行代码,是筛选的必须,所以,可以在“setting.py”中设置全局属性,以省略这一行代码
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = FacultyFilter
# ================mojer视图======================
class MojerViewSet(ModelViewSet):
queryset = Mojer.objects.all()
serializer_class = MojerSerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = MajorFilter
# ================Student视图======================
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = StudentFilter
在**“setting.py”**中添加以下设置,进行全局设定,就不用在每一个视图函数中增加以下代码filter_backends = (DjangoFilterBackend, )
# ===========REST Framework全局设置============
REST_FRAMEWORK = {
# 设置全局的Filter Backends
'DEFAULT_FILTER_BACKENDS' : [
'django_filters.rest_framework.DjangoFilterBackend',
]
}
4、 优化筛选,实现模糊查询
之前的步骤完成后,就已经可以实现筛选功能了,但是,之前的只支持精准查询,不能实现模糊查询,这里就是进一步优化,实现模糊查询功能。在**“filter.py”**文件中重写需要模糊查询的字段
# =========导入模块============
from django_filters import FilterSet
from studentweb.models import Faculty, Major, Student # 导入数据类
# ============faculty的filter类========
class FacultyFilter(FilterSet):
# 重新写需要模糊查询的字段
name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
model = Faculty
fields = ("name",) # 注意,在元组中,如果只有一个元素,一定要加 “,”,不然会报错
# ============major的filter类========
class MajorFilter(FilterSet):
class Meta:
model = Major
fields = ("name", "faculty")
# ============student的filter类========
class StudentFilter(FilterSet):
class Meta:
model = Student
fields = ("sno", "name", "moble")
第四步,实现查询(搜索)功能
筛选是匹配一个字段,而查询(搜索),则是匹配多个字段的。
1、在 views.py 中写入以下代码:
# ============导入模块==================
from rest_framework.viewsets import ModelViewSet # 封装完成的ModleViewset视图集
from studentweb.models import Faculty, Major, Student # 导入数据类
from studentweb.serializer import FacultySerializer, MajorSerializer, StudentSerializer # 导入序列化的数据类
from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
from studentweb.filter import FacultyFilter, MajorFilter, StudentFilter # 导入筛选类
from rest_framework.filter import SearchFilter # 导入搜索的后台功能
# ================Faculty视图======================
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台,由于这一行代码,是筛选的必须,所以,可以在“setting.py”中设置全局属性,以省略这一行代码。
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = FacultyFilter
# ================mojer视图======================
class MojerViewSet(ModelViewSet):
queryset = Mojer.objects.all()
serializer_class = MojerSerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = MajorFilter
# ================Student视图======================
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = FacultySerializer
# 设置查找的后台功能,在filter_backends元组中添加“SearchFilter”。如果筛选设置了全局,那么搜索也要在全局设置
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, SearchFilter) # 这里需要注意,因为是元祖,所以只有一个元素时,需要在元素后面加 “,”
# 指定筛选的类
filter_class = StudentFilter
# 指定需要查询(搜索)的字段
search_fields = ("sno", 'name', 'moble')
2、在**“setting.py”**中添加以下设置
进行全局设定,就不用在每一个视图函数中增加以下代码filter_backends = (DjangoFilterBackend, SearchFilter)
# ===========REST Framework全局设置============
REST_FRAMEWORK = {
# 设置全局的Filter Backends
'DEFAULT_FILTER_BACKENDS' : [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
]
}
第五步,实现分页
1、单独设置的方法
- 在 app 的文件夹中,新建一个“paginations.py”的文件,用来存放筛选的类
在改文件中写入以下内容
# ===========导入模块=============
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 5 # 默认的每页数量
page_query_param = "page" # 默认的页码的参数名
page_size_query_param = "size" # 默认的每页数量的参数名
max_page_size = 10 # 设置每页最大数量
- 在 “views.py” 中引用并配置
# ============导入模块==================
from rest_framework.viewsets import ModelViewSet # 封装完成的ModleViewset视图集
from studentweb.models import Faculty, Major, Student # 导入数据类
from studentweb.serializer import FacultySerializer, MajorSerializer, StudentSerializer # 导入序列化的数据类
from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
from studentweb.filter import FacultyFilter, MajorFilter, StudentFilter # 导入筛选类
from rest_framework.filter import SearchFilter # 导入搜索的后台功能
from studentweb.paginations import MyPageNumberPagination
# ================Faculty视图======================
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台,由于这一行代码,是筛选的必须,所以,可以在“setting.py”中设置全局属性,以省略这一行代码。
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = FacultyFilter
# ================mojer视图======================
class MojerViewSet(ModelViewSet):
queryset = Mojer.objects.all()
serializer_class = MojerSerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = MajorFilter
# ================Student视图======================
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = FacultySerializer
# 设置查找的后台功能,在filter_backends元组中添加“SearchFilter”。如果筛选设置了全局,那么搜索也要在全局设置
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, SearchFilter) # 这里需要注意,因为是元祖,所以只有一个元素时,需要在元素后面加 “,”
# 指定筛选的类
filter_class = StudentFilter
# 指定需要查询(搜索)的字段
search_fields = ("sno", 'name', 'moble')
# 增加分页
pagination_class = MyPageNumberPagination
2、设置全局的方法在**“setting.py”**中添加以下设置
# ===========REST Framework全局设置============
REST_FRAMEWORK = {
# =======设置全局的Filter Backends==========
'DEFAULT_FILTER_BACKENDS' : [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filter.SearchFilter',
],
# ======设置分页=========
'DEFAULT_PAGINATION_CLASS' : 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE' : 10
}
第六步,生成API文档
可选的有:
- CoreAPI --------------------- 注:这个库已经不更新了
- Swagger---------------------注:推荐使用这个
1、安装并注册
pip install drf-yasg
INSTALLED_APPS = [
# ...
'drf-yasg',
]
2、在最外层的urls.py中配置
from django.contrib import admin
from django.urls import path, include
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
schema_view = get_schema_view(
openapi.Info(
title = "API借口文档平台", # 必须参数
default_version = "V1", # 必须参数
description = "这是一个接口文档",
terms_of_service = "",
contact = openapi.Contact(email=""),
license = openapi.License(name="BSD License"),
),
public = True,
# permission_classes = (permissions.AllowAny,), # 权限类
)
urlpatterns = [
path("admin/", admin.site.urls),
path("api/v1/", include('studentweb.urls')),
# 配置API文档的路径
path("docs", schema_view.with_ui('swagger', cache_timeout=0), name="schema-swagger-ui")
]
3、使文档显示中文
在 views.py 文件中,为每一个类添加一个注释,即可完成。例如:
# ============导入模块==================
from rest_framework.viewsets import ModelViewSet # 封装完成的ModleViewset视图集
from studentweb.models import Faculty, Major, Student # 导入数据类
from studentweb.serializer import FacultySerializer, MajorSerializer, StudentSerializer # 导入序列化的数据类
# 以下是新增的
from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
from studentweb.filter import FacultyFilter, MajorFilter, StudentFilter # 导入筛选类
# ================Faculty视图======================
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台,由于这一行代码,是筛选的必须,所以,可以在“setting.py”中设置全局属性,以省略这一行代码
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = FacultyFilter
# ================mojer视图======================
class MojerViewSet(ModelViewSet):
queryset = Mojer.objects.all()
serializer_class = MojerSerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = MajorFilter
# ================Student视图======================
class StudentViewSet(ModelViewSet):
"""
create:
创建学生信息
update:
完整更新学生信息
partial_update:
部分更新学生信息
destroy:
删除学生信息
list:
获取所有学生信息
"""
queryset = Student.objects.all()
serializer_class = FacultySerializer
# 设定筛选的后台
filter_backends = (DjangoFilterBackend, ) # 这里需要注意,因为是元祖,所以需要在每一个元素后面加 “,”
# 指定筛选的类
filter_class = StudentFilter