Django REST framework学习记录,包括REST的基本用法,Django-filter实现筛选、查询、模糊查询等功能,实现分页,用Swagger生成api文档

前言

这个文章,是我学习王进老师的课程的笔记,感谢王进老师。强烈推荐大家去看看王进老师的课程

第一步,安装和注册 Django REST Framework

可以通过 pip 来安装。最好在一个虚拟环境中进行操作,以隔离出您的项目所需的依赖项。

步骤如下:

  1. 打开终端或命令行界面。
  2. 进入您的项目虚拟环境。
  3. 运行以下命令来安装 Django REST Framework:
pip install djangorestframework
  1. 安装完成后,您需要将它添加到您的项目的 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 来安装。最好在一个虚拟环境中进行操作,以隔离出您的项目所需的依赖项。

步骤如下:

  1. 打开终端或命令行界面。
  2. 进入您的项目虚拟环境。
  3. 运行以下命令来安装 Django-filter:
pip install django-filter
  1. 安装完成后,您需要将它添加到您的项目的 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文档

可选的有:

  1. CoreAPI --------------------- 注:这个库已经不更新了
  2. 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值