1.1 概念
drf框架是基于Django框架,用于快速构建Web RESTful API的工具。
1.2 特点
(1) 提供了定义序列化器Serializer的方法,可以快速根据Django ORM 或者其他库自动序列化、反序列化;
(2) 提供了丰富的类视图、MIXIN扩展类,根据需求组合继承,简化视图的编写;
(3) 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
(4) 支持多种身份认证和权限认证方式;
(5) 内置了限流系统;
(6) 可视化API接口;
(7) 可扩展性 , 插件丰富。
2. drf的使用
drf对代码的简化主要是对视图的增删改查、请求数据的反序列化和响应数据的序列化进行简化,所以主要介绍drf的序列化器和视图集的使用。
2.2 创建模型
class Grade(models.Model): # 班级
name = models.CharField(max_length=16, null=False, unique=True)
class Meta:
db_table = 'grade'
ordering = ['id']
class Course(models.Model): # 课程
name = models.CharField(max_length=32, unique=True, null=False)
class Meta:
db_table = 'course'
ordering = ['id']
class Student(models.Model): # 学生
name = models.CharField(max_length=16, null=False)
age = models.IntegerField(null=True)
gender = models.BooleanField(null=False, default=0)
g = models.ForeignKey(Grade, on_delete=models.CASCADE)
c = models.ManyToManyField(Course)
class Meta:
db_table = 'student'
ordering = ['id']
2.3 创建序列化器
在/student/serializers.py
文件中,建立三个模型对应的序列化器;序列化器有两个主要功能:序列化和反序列化。如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化;如果前端是POST请求,要对数据库进行改动,则需要拿到前端发来的数据,进行校验,校验通过将数据写入数据库,这个过程称为反序列化。这能极大的简化视图代码量,后面会做个对比。代码如下:
class GradeSerializer(serializers.ModelSerializer):
class Meta:
# 指定序列化器对应的模型
model = Grade
# 指定需要序列化的字段,‘__all__’表示所有字段
fields = ['name']
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ['name']
class StudentSerializer(serializers.ModelSerializer):
# 自定义序列化和反序列化字段校验条件,默认使用建表约束校验;也可以使用extra_kwargs
# SlugRelatedField指定关联对象的指定字段,关联字段默认为关联对象id
c = serializers.SlugRelatedField(slug_field='name', many=True, queryset=Course.objects.all())
g = serializers.SlugRelatedField(slug_field='name', queryset=Grade.objects.all())
class Meta:
model = Student
# 自定义校验
extra_kwargs = {'age': {'max_value': 30, 'min_value': 0}}
fields = '__all__'
# 返回数据预处理
def to_representation(self, instance):
data = super().to_representation(instance)
if data['gender'] == 0:
data['gender'] = '女'
else:
data['gender'] = '男'
return data
2.4 编写视图
在/student/views.py
文件中,编写视图,每个模型对应一个视图,继承drf的viewsets.ModelViewSet
类,包含增删改查四大操作,通过不同的请求方法映射到drf定义的对应的动作action方法上。action方法包括create(新增)、retrieve(查询详情)、destroy(删除)、update(修改)、list(列表展示)。代码如下:
class StudentView(viewsets.ModelViewSet):
queryset = Student.objects.all() # 指定查询结果集
serializer_class = StudentSerializer # 指定序列化器
class GradeView(viewsets.ModelViewSet):
queryset = Grade.objects.all()
serializer_class = GradeSerializer
class CourseView(viewsets.ModelViewSet):
queryset = Course.objects.all()
serializer_class = CourseSerializer
2.5 注册路由
在/exercise2/urls.py
文件中,注册根路由
urlpatterns = [
path('api/', include('student.urls'))
]
在/student/urls.py
文件中,注册资源路由
# 使用drf的视图集就不需要编写路由,通过DefaultRouter的register方法注册就可以了
router = DefaultRouter()
router.register('student', views.StudentView)
router.register('course', views.CourseView)
router.register('grade', views.GradeView)
urlpatterns = [
path('', include(router.urls))
]
2.6 列举url
列举一下资源为student的请求路径和方式,其他资源类似:
GET http://127.0.0.1:8000/api/student/ 查询所有学生信息
POST http://127.0.0.1:8000/api/student/ 传入学生各项信息,创建该学生对象
GET http://127.0.0.1:8000/api/student/1/ 查询id为1的学生信息 默认过滤字段为id,可自定义过滤器
DELETE http://127.0.0.1:8000/api/student/1/ 删除id为1的学生,默认过滤字段为id
PUT http://127.0.0.1:8000/api/student/1/ 修改id为1的学生信息,默认过滤字段为id
来自:DjangoRestFramework框架简介及基本使用 - 简书 (jianshu.com)