大概流程:先在serializers.py中定义序列化器类,然后在views.py中定义类,在类中定义get方法,方法中首先需要获取数据库数据(objects.all()),然后实例化序列化器,得到序列化器对象(使用已经定义好的序列化器对获取到的数据进行序列化操作),再调用序列化器对象的data方法来获取转换后的数据,最后使用JsonResponse返回数据。
代码如下:
serializers.py
from rest_framework import serializers
from stuapi.models import Students
"""
serializers 是drf提供给开发者调用的序列化器模块
里面声明了所有的可用序列化器的基类;
Serializer 序列化器基类,drf中所有的序列化器都必须继承于Serializer
ModelSerializer 模型序列化器基类,是序列化器基类的子类,在工作中,除了Serializer基类以外,最常用的序列化器类基类
"""
class Student1Serializer(serializers.Serializer):
"""学生信息序列化器"""
# 1.转换的字段说明
# 字段 = serializers.字段类型(选项=选项值)
id = serializers.IntegerField()
name = serializers.CharField()
sex = serializers.BooleanField()
age = serializers.IntegerField()
description = serializers.CharField()
views.py
from django.http.response import JsonResponse
from django.views import View
from stuapi.models import Students
from .serializers import Student1Serializer, Student2Serializer
class StudentView(View):
def get1(self, request):
"""序列化器,序列化阶段的调用"""
# 1.获取数据集
serializer_list = Students.objects.all()
# 2.实例化序列化器,得到序列化器对象
serializer = Student1Serializer(instance=serializer_list, many=True)
# 3.调用序列化对象的data属性方法获取转换后的数据
data = serializer.data
# 4.响应数据
return JsonResponse(data, status=200, safe=False)
models.py
class Students(models.Model):
##学生信息
name = models.CharField(max_length=100,verbose_name="姓名")
sex = models.BooleanField(default=1,verbose_name="性别")
age = models.IntegerField(verbose_name="年龄",help_text="年龄不能小于0")
classmate = models.CharField(max_length=5,verbose_name="班级编号")
description = models.TextField(max_length=1000,verbose_name="个性签名")
class Meta:
db_table="tb_student"
verbose_name = "学生"
verbose_name_plural = verbose_name
大概流程:先在serializers.py中定义反序列化器类,可以在类中定义数据的验证方法,例如:validate(self, attrs)----验证所有数据,validate_name(self, data)----验证数据的某个字段,定义添加数据create和更新数据update, 然后在views.py中先获取前端传来的数据,然后对数据进行实例化序列化器对象,并验证数据的合法性,最后返回结果(在方法中定义报错信息)
serialiezers.py
from rest_framework import serializers
from stuapi.models import Students
"""
serializers 是drf提供给开发者调用的序列化器模块
里面声明了所有的可用序列化器的基类;
Serializer 序列化器基类,drf中所有的序列化器都必须继承于Serializer
ModelSerializer 模型序列化器基类,是序列化器基类的子类,在工作中,除了Serializer基类以外,最常用的序列化器类基类
"""
class Student2Serializer(serializers.Serializer):
"""学生信息反序列化器"""
# 1.转换的字段说明
# 字段 = serializers.字段类型(选项=选项值)
id = serializers.IntegerField(read_only=True) # read_only=True,在客户端提交数据【反序列化阶段不会要求id字段】
name = serializers.CharField(required=True) # required=True,反序列化阶段必填
sex = serializers.BooleanField(default=True) # default=True,反序列化阶段,用户没填,默认为True
age = serializers.IntegerField(max_value=100,min_value=0,error_messages={
"min_value": "The Age Must Be 0 <= age",
"max_value": "The Age Must Be age <=100",
}) # age反序列化值必须是 0,否则序列化器无法识别
validate开头的方法,会自动被is_valid调用的
"""
if data in ['Python','Django']:
raise serializers.ValidationError(detail='学生姓名不能为Python',code='validate_name')
return data
def create(self, validated_data):
"""
添加数据操作,添加数据以后,就自动实现了从字典变成模型对象的过程
方法名固定为create,固定参数validated_data就是验证成功以后的结果
"""
student = Students.objects.create(**validated_data)
return student
def update(self, instance, validated_data):
"""
更新数据操作
方法名固定为update
固定参数instance,实例化序列化器对象时,必须传入的模型
固定参数validated_data就是验证成功以后的数据
更新数据以后,就自动实现了从字典变成模型对象的过程
"""
instance.name = validated_data["name"]
instance.age = validated_data["age"]
instance.sex = validated_data["sex"]
instance.description = validated_data["description"]
instance.save()
return instance
views.py
import json
from django.http.response import JsonResponse
from django.views import View
from stuapi.models import Students
from .serializers import Student1Serializer, Student2Serializer
class StudentView(View):
def get2(self,request):
"""反序列化,采用字段选项来验证数据{验证失败不抛出异常}"""
# 1.获取前端传来的数据
# data = json.dumps(request.body)
data = {
"name":"校长",
"age":-10,
"sex":1,
"description":"很懒"
}
# 2.1 实例化序列化器对象
serializer = Student2Serializer(data=data)
# 2.2 验证数据是否合法
ret = serializer.is_valid()
# 3.作出判断,并返回结果
if ret:
return JsonResponse(dict(serializer.validated_data))
else:
return JsonResponse(dict(serializer.errors))
def get3(self,request):
"""反序列化,采用字段选项来验证数据{验证失败抛出异常}"""
# 1.获取前端传来的数据
# data = json.dumps(request.body)
data = {
"name":"Xiaohong",
"age":18,
"sex":True,
"description":"很懒"
}
# 2.1 实例化序列化器对象
serializer = Student2Serializer(data=data)
# 2.2 验证数据是否合法
serializer.is_valid(raise_exception=True)
# 3.返回数据结果
return JsonResponse(dict(serializer.validated_data))
def get4(self,request):
"""反序列化,新增数据"""
# 1.获取前端传来的数据
# data = json.dumps(request.body)
data = {
"name":"Xiaohong",
"age":18,
"sex":True,
"description":"很懒的版本"
}
# 2.1 实例化序列化器对象
serializer = Student2Serializer(data=data)
# 2.2 验证数据是否合法
serializer.is_valid(raise_exception=True)
# # 3.返回数据结果
# data = serializer.validated_data
# # 在数据库中创建数据
# student = Students.objects.create(**data)
# serializer = Student2Serializer(instance=student)
# 在serializer中定义create方法后,数据会自动保存
serializer.save() # 会根据实例化序列化器的时候,是否传入instance属性来自动调用create或者update方法
# 返回数据
return JsonResponse(serializer.data,status=201)
def get(self, request):
"""
反序列化,验证数据后,更新数据库数据
"""
pk = 5
try:
student = Students.objects.get(pk=pk)
except Students.DoesNotExist:
return JsonResponse({"errors":"该学生不存在!"})
# 2.接收客户提交的数据
# 模拟提交过来的数据
data = {
"name": "Xiaohong",
"age": 18,
"sex": True,
"description": "更新数据测试"
}
# 3.修改实例化序列化器对象
serializer = Student2Serializer(instance=student, data=data)
# 4.验证数据是否合法
serializer.is_valid(raise_exception=True)
# 5.入库
serializer.save()
# 6.返回结果
return JsonResponse(serializer.data, status=201)
希望本篇文章对你有所帮助!