Django中DRF框架序列化器数据操作及模型序列化器

一、序列化器的数据操作特性:

 1、如果在创建序列化器对象时,仅传递data参数,使用序列化器对象调用save方法时,会自动调用序列化         器类中的create方法
 2、create方法用于对数据进行创建操作
 3、序列化器类中的create方法,validated_data参数为校验通过之后的数据(一般字典类型)
 4、在调用save方法时,可以传递任意的关键字参数,并且会自动合并到validated_data字典中
 5、create方法一般需要将创建成功之后模型对象返回
 5、在创建序列化器对象时,仅仅只传递data参数,那么必须得调用is_valid()方法通过之后
 6、如果没有调用save方法,使用创建序列化器对象.data属性,来获取序列化输出的数据
   (会把validated_data数据作为输入源,参照序列化器字段的定义来进行输入)
 7、如果调用了save方法,使用创建序列化器对象.data属性,来获取序列化输出的数据
   (会把create方法返回的模型对象数据作为输入源,参照序列化器字段的定义来进行输出)
class ProjectsView(View):
    def get(self, request):
        queryset = Projects.objects.all()
        serializer = ProjectSerilizer(instance=queryset, many=True)
        return JsonResponse(serializer.data, safe=False)

    def post(self, request):
        try:
            python_data = json.loads(request.body)
        except Exception as e:
            return JsonResponse({'msg': '参数有误'}, status=400)

        serializer11 = ProjectSerilizer(data=python_data)
        if not serializer11.is_valid():
            return JsonResponse(serializer11.errors, status=400)
        serializer11.save(myname='珍惜', myage=18)
        return JsonResponse(serializer11.data, status=201)
# 1、如果定义了一个模型类中没有的字段,并且该字段需要输出(序列化输出)
# 2、需要在create方法、update方法中的模型对象上,添加动态的属性即可
# token = serializers.CharField(read_only=True)

# 3、如果定义了一个模型类中没有的字段,并且该字段需要输入(反序列化输入)
# 4、需要在create方法、update方法调用之前,将该字段pop调用
# sms_code = serializers.CharField(write_only=True)
    def create(self, validated_data: dict):
        myname = validated_data.pop('myname')
        myage = validated_data.pop('myage')
        validated_data.pop('sms_code')
        project_obj = Projects.objects.create(**validated_data)
        project_obj.token = 'xxxxxxxxxxxxx'
        return project_obj
# 1、如果在创建序列化器对象时,同时instance和data参数,使用序列化器对象调用save方法时,会自动调用序列化器类中的update方法
# 2、update方法用于对数据进行更新操作
# 3、序列化器类中的update方法,instance参数为待更新的模型对象,validated_data参数为校验通过之后的数据(一般字典类型)
# 4、在调用save方法时,可以传递任意的关键字参数,并且会自动合并到validated_data字典中
# 5、update方法一般需要将更新成功之后模型对象返回
    def update(self, instance, validated_data: dict):
        # for key, value in validated_data.items():
        #     setattr(instance, key, value)
        instance.name = validated_data.get('name') or instance.name
        instance.leader = validated_data.get('leader') or instance.leader
        instance.is_execute = validated_data.get('is_execute') or instance.is_execute
        instance.desc = validated_data.get('desc') or instance.desc
        instance.save()
        return instance
创建序列化器对象
ProjectSerilizer(instance=queryset, many=True)
1、只传递instance参数
    a.调用is_valid方法会报错
    b.调用errors、validated_data都会报错
    c.不能调用save方法
    d.调用data属性,可以进行序列化输出

2、只传递data参数
    a.必须得调用is_valid方法开始对数据进行校验
    b.调用errors、validated_data都不会报错
    c.调用save方法会自动调用序列化器类的create方法
    d.调用data属性,可以进行序列化输出
    (如果有调用save方法并且create方法有返回模型对象的话,那么会把模型对象作为序列化输出的源数据;如果没有调用save方法,那么会把validated_data作为序列化输出的源数据)

3、同时传递instance、data参数
    a.必须得调用is_valid方法开始对数据进行校验
    b.调用errors、validated_data都不会报错
    c.调用save方法会自动调用序列化器类的update方法
    d.调用data属性,可以进行序列化输出
    (如果有调用save方法并且update方法有返回模型对象的话,那么会把模型对象作为序列化输出的源数据;如果没有调用save方法,那么会把validated_data作为序列化输出的源数据)

二、模型序列化器类:

定义模型序列化器类
1、继承serializers.ModelSerializer类或者其子类
2、需要在Meta内部类中指定model、fields、exclude类属性参数
3、model指定模型类(需要生成序列化器的模型类)
4、fields指定模型类中哪些字段需要自动生成序列化器字段
5、会给id主键、指定了auto_now_add或者auto_now参数的DateTimeField字段,添加read_only=True,仅仅只进行序列化输出
6、有设置unique=True的模型字段,会自动在validators列表中添加唯一约束校验<UniqueValidator
7、有设置default=True的模型字段,会自动添加required=False
8、有设置null=True的模型字段,会自动添加allow_null=True
9、有设置blank=True的模型字段,会自动添加allow_blank=True
class ProjectModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Projects
        # fields指定模型类中哪些字段需要自动生成序列化器字段
        # a.如果指定为"__all__",那么模型类中所有的字段都需要自动转化为序列化器字段
        # b.可以传递需要转化为序列化器字段的模型字段名元组
        fields = "__all__"
        # fields = ('id', 'name', 'leader')
        # c.exclude指定模型类中哪些字段不需要转化为序列化器字段,其他的字段都需要转化
        # exclude = ('create_time', 'update_time')

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值