首页 > 其他分享 > 33-DRF框架-反序列化使用

33-DRF框架-反序列化使用

时间:2023-02-23 22:26:58浏览次数:30  
标签:validated False 33 instance 序列化 data tss DRF

# 增加  修改
# 把参数转成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

相关文章