介绍
- 上篇文章我们介绍了最基础的序列化器(serializers),python Django Rest_Framework框架 APIView介绍与序列化器详解(图文并茂版)使用它对数据对象进行序列化、反序列化时操作是比较麻烦的
- 如果我们需要进行序列化的对象是Django的模型类,DRF也为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类
- 序列化器需要与视图一起使用,后续的文章我们会介绍更多类型的DRF视图类帮助我们快速的使用序列化器,而不需要书写过多的重复视图代码
区别与优点
ModelSerializer与常规的Serializer相同,但提供了:
- 基于Django模型类自动生成一系列字段
- 基于Django模型类自动为序列化器生成validators
- 包含默认的create() 创建方法和update() 更新方法的实现
定义模型类序列化器
- 为下述的django模型类创建一个模型类序列化器:
from django.db import models
# Create your models here.
class Students(models.Model):
name = models.CharField(verbose_name='姓名', max_length=255)
classmate = models.IntegerField(verbose_name='班级')
studentID = models.IntegerField(verbose_name='学号')
description = models.TextField(verbose_name='描述')
class Meta:
db_table = 'students'
- 模型类序列化器如下:
class StudentModelSerializers(ModelSerializer):
"""学生信息模型序列化器"""
class Meta:
model = Students
fields = '__all__'
- model:是指对哪一个django模型类创建序列化器
- fields:是指生成序列化器中包含模型类哪些字段,
__all__
是指为包含全部字段
查看生成的模型序列化器
- 在这里我们使用的终端命令行操作,来查看生成的序列化器,并没有直接使用py文件的形式引入查看
- 首先,打开终端,输入下述的命令,进入django的shell命令行:
python manage.py shell
- 导入我们自定义的StudentModelSerializers模型序列化器,并实例化,打印输出
使用模型类序列化器
- 我们直接使用前面的视图函数即可:
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Students
from .serilizers import StudentsSerializers,StudentModelSerializers
class Students1Apiview(APIView):
def get(self, request):
# 获取数据集(学生模型对象)
students_data = Students.objects.all()
# 实例化序列化器,得到序列化器对象
ser = StudentModelSerializers(instance=students_data, many=True)
# 调用序列化器对象的data属性方法获取转换后的数据
data = ser.data
# 响应数据
return Response(data)
def post(self, request):
# 反序列化数据
student = StudentModelSerializers(data=request.data)
# 校验不通过
if not student.is_valid():
# 返回错误信息
return Response(student.errors)
# 校验通过,保存数据
student.save()
# 响应数据
return Response(student.data)
class StudentDerail1Apiview(APIView):
# 获取一个学生的信息
def get(self, request, pk):
student = Students.objects.get(pk=pk)
ser = StudentModelSerializers(instance=student)
return Response(ser.data)
# 修改一个学生的信息
def put(self, request, pk):
instance = Students.objects.get(pk=pk)
ser = StudentModelSerializers(instance=instance, data=request.data)
if not ser.is_valid():
return Response(ser.errors)
ser.save()
return Response(ser.data)
# 删除一个学生的信息
def delete(self, request, pk):
Students.objects.get(pk=pk).delete()
return Response({'detail': '删除成功!!'})
- 路由文件:
from django.urls import path, re_path
from . import views
urlpatterns = [
# 基出序列化器
# 多数据操作
path('students/', views.StudentsApiview.as_view()),
# 单个数据进行操作
re_path('students/(?P<pk>\d+)/', views.StudentDerailApiview.as_view()),
# 模型序列化器
path('students1/', views.Students1Apiview.as_view()),
re_path('students1/(?P<pk>\d+)/', views.StudentDerail1Apiview.as_view()),
]
-
页面显示,与普通的序列化器定义的完全相同(查看全部数据):
-
查看单条数据- 添加数据:
-
添加成功!!
模型序列化器字段
- fields:使用fields字段来明确需要的模型字段,
__all__
表示包含所有模型字段,也可以写明具体哪些模型字段,如下:
fields = ['id', 'name', 'classmate']
- exclude:使用exclude字段表示:可以排除掉哪些模型字段,与上面的字段不能同时使用
exclude = ['description']
- read_only_fields:指明只读字段,即仅用于序列化输出时的字段
read_only_fields = ['id', 'name', 'studentID']
- extra_kwargs:使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
extra_kwargs = {
'name': {'required': True},
'studentID': {'min_value': 41809010200, 'required': True},
}