一、序列化器的数据操作特性:
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')