# 增加 修改
# 把参数转成model对象,操作数据库
#步骤:
# 1. 创建序列化对象 data传递参数进行验证
# 2. is_validate() 函数验证
# 3. 通过可以使用 validated_data 获取反序列化的数据
# 4. 不通过errors获取到错误信息
# 5. 保存或者更新数据
'''
在获取反序列化的数据前,必须调用 is_valid() 方法进行验证,验证成功返回True,否则返回False。
验证失败,可以通过序列化器对象的 errors 属性获取错误信息,返回字典,包含了字段和字段的错误。
如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名;
验证成功,可以通过序列化器对象的validated_data属性获取数据
在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为,通过构造序列化器对象,
并将要反序列化的数据传递给 data 构造参数,进而进行验证
'''
创建序列对象
# 创建序列化对象
class TuShuSerializer(Serializer):
# 描述模型类中的字段
tid = serializers.IntegerField(label="图书id", read_only=True)
name = serializers.CharField(label="图书名称", max_length=20)
riqi = serializers.DateField(label="上市日期", required=False)
count = serializers.IntegerField(label="图书数量", required=False)
is_delete = serializers.BooleanField(label="是否删除", default=False)
# {"tid": 1, "name": "喜喜", "riqi": "2022-01-03", "is_delete": true}
# renwu_set = serializers.PrimaryKeyRelatedField(label="关联人物", many=True, read_only=True)
# renwu_set = serializers.StringRelatedField(label="关联人物", many=True, read_only=True)
# python代码从上到下执行,类卸载下面无法调用
renwu_set = RenWuSerializer(read_only=True, many=True)
# 当验证成功之后,如果想要保存/修改数据,需要使用create() 和 update()函数进行操作
# 反序列化数据的时候,不管添加还是更新,只需要在view中调用save()函数即可
# 不传instance 调用create();传instance 调用的是update()
def create(self, validated_data):
# post添加数据...返回添加的数据和添加到数据库中
return TuShu.objects.create(**validated_data)
# instance :表示更新的数据对象; validated_data :表示更新的数据来源...反序列化数据
def update(self, instance, validated_data):
# 更新数据没有全部传递的时候,用原来的数据...不变
instance.name = validated_data.get("name", instance.name)
instance.riqi = validated_data.get("riqi", instance.riqi)
instance.count = validated_data.get("count", instance.count)
instance.is_delete = validated_data.get("is_delete", instance.is_delete)
# 保存
instance.save()
# 返回更新后的数据对象
return instance
添加
#视图函数验证和保存
class TuShuView(View):
def get(self, request):
# 查询所有
qset = TuShu.objects.all()
ts = TuShuSerializer(instance=qset, many=True)
return JsonResponse(data=ts.data, safe=False)
# post增加图书信息,参数为json格式
def post(self, request):
# 1. 参数转换成字典格式
data = json.loads(request.body)
# 2. 参数校验
tss = TuShuSerializer(data=data)
# 3. 添加数据...is_valid()对反序列化的数据进行验证,成功则返回true
# 参数: raise_exception=True:校验不通过就报异常: rest_framework.exceptions.ValidationError: {'name': [ErrorDetail(string='该字段是必填项。', code='required')]}
if tss.is_valid():
# tss.validated_data获取反序列化的数据
# 保存数据= OrderedDict([('name', '这是一本书'), ('riqi', datetime.date(2022, 1, 24)), ('count', 100), ('is_delete', False)])
# print("保存数据=", tss.validated_data, tss.save(),tss.data)
# 保存
tss.save()
return JsonResponse(data=tss.data,safe=False,status=200)
else:
# 验证失败的错误信息
# {'name': [ErrorDetail(string='该字段是必填项。', code='required')]}
# print(tss.errors)
return JsonResponse(data=tss.errors, safe=False,status=400)
修改
class TuShuView2(View):
# 查询单个图书接口
def get(self, request, tid):
try:
q = TuShu.objects.get(tid=tid)
except Exception:
return JsonResponse(data={}, status=404)
tss = TuShuSerializer(instance=q)
return JsonResponse(data=tss.data, safe=False)
# 修改信息
def put(self, request, tid):
try:
q = TuShu.objects.get(tid=tid)
except Exception:
return JsonResponse(data={}, status=404)
# 获取请求参数
data = json.loads(request.body)
# 创建序列化对象,用于更新数据
tss = TuShuSerializer(instance=q, data=data)
if tss.is_valid():
# 保存更新
tss.save()
return JsonResponse(data=tss.data, safe=False, status=201)
else:
return JsonResponse(data=tss.errors, safe=False, status=400)
#路由
urlpatterns = [
re_path(r"tushu/$", TuShuView.as_view(), name="tushu"),
re_path(r"tushu2/$", TuShuView2.as_view(), name="tushu2"),
]
标签:validated,False,33,instance,序列化,data,tss,DRF
From: https://www.cnblogs.com/kh-1314/p/17148710.html