APIView还新增了如下的类属性:
作用:
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'
from rest_framework import serializers
class StudentsModelSerializers(serializers.Serializer):
name = serializers.CharField()
classmate = serializers.IntegerField()
studentID = serializers.IntegerField()
description = serializers.CharField()
参数名称 | 作用 |
---|---|
max_length | 最大长度 |
min_lenght | 最小长度 |
allow_blank | 是否允许为空 |
trim_whitespace | 是否截断空白字符 |
max_value | 最小值 |
min_value | 最小值 |
参数名称 | 作用 |
---|---|
read_only | 表明该字段仅用于序列化输出,默认False |
write_only | 表明该字段仅用于反序列化输入,默认False |
required | 表明该字段在反序列化时必须输入,默认True |
default | 反序列化时使用的默认值 |
allow_null | 表明该字段是否允许传入None,默认False |
validators | 该字段使用的验证器 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展示API页面时,显示的字段名称 |
help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Students
from .serilizers import StudentsModelSerializers
class StudentsApiview(APIView):
def get(self, request):
# 获取数据集(学生模型对象)
students_data = Students.objects.all()
# 实例化序列化器,得到序列化器对象
ser = StudentsModelSerializers(instance=students_data, many=True)
# 调用序列化器对象的data属性方法获取转换后的数据
data = ser.data
# 响应数据
return Response(data)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('students.urls')) # students子应用总路由
]
from django.urls import path
from .views import StudentsApiview
urlpatterns = [
path('students/', StudentsApiview.as_view())
]
使用序列化器大概分为四步:
反序列化时数据校验可参考:python Django Rest_Framework框架 反序列化时数据校验的三种方法(图文并茂版)
使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据并将数据转换成模型类对象并保存
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名
验证成功,可以通过序列化器对象的validated_data属性获取数据
在定义序列化器时,指明每个字段的序列化类型和选项参数,这就是一种验证行为
通过构造序列化器对象,并将要反序列化的数据传递给data构造参数,进而进行验证
def create(self, validated_data):
"""新增数据"""
return validated_data
def update(self, instance, validated_data):
"""更新数据"""
return validated_data
选择调用上述的哪一种方法,是取决于实例化序列化器时传递的参数:
如果创建序列化器对象的时候,没有传递instance属性,则调用save()方法的时候,create()被调用
如果传递了instance属性,则调用save()方法的时候,update()被调用
两个方法都需要传递data属性,才可以使用
如下举例:
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Students
from .serilizers import StudentsModelSerializers
class StudentsApiview(APIView):
def get(self, request):
# 获取数据集(学生模型对象)
students_data = Students.objects.all()
# 实例化序列化器,得到序列化器对象
ser = StudentsModelSerializers(instance=students_data, many=True)
# 调用序列化器对象的data属性方法获取转换后的数据
data = ser.data
# 响应数据
return Response(data)
def post(self, request):
# 反序列化数据
student = StudentsModelSerializers(data=request.data)
# 校验不通过
if not student.is_valid():
# 返回错误信息
return Response(student.errors)
# 校验通过,保存数据
student.save()
# 响应数据
return Response(student.data)
from django.urls import path, re_path
from .views import StudentsApiview, StudentDerailApiview
urlpatterns = [
path('students/', StudentsApiview.as_view()),
# 单个数据进行操作
re_path('students/(?P\d+)/' , StudentDerailApiview.as_view())
]
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Students
from .serilizers import StudentsModelSerializers
class StudentsApiview(APIView):
def get(self, request):
# 获取数据集(学生模型对象)
students_data = Students.objects.all()
# 实例化序列化器,得到序列化器对象
ser = StudentsModelSerializers(instance=students_data, many=True)
# 调用序列化器对象的data属性方法获取转换后的数据
data = ser.data
# 响应数据
return Response(data)
def post(self, request):
# 反序列化数据
student = StudentsModelSerializers(data=request.data)
# 校验不通过
if not student.is_valid():
# 返回错误信息
return Response(student.errors)
# 校验通过,保存数据
student.save()
# 响应数据
return Response(student.data)
class StudentDerailApiview(APIView):
# 获取一个学生的信息
def get(self, request, pk):
student = Students.objects.get(pk=pk)
ser = StudentsModelSerializers(instance=student)
return Response(ser.data)
# 修改一个学生的信息
def put(self, request, pk):
instance = Students.objects.get(pk=pk)
ser = StudentsModelSerializers(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': '删除成功!!'})