一、 序列化器中的类属性字段
序列化 中所定义的 类属性 字段,一般情况下与 模型类 字段 相对应
默认情况下,这些类属性字段既可以进行序列化输出,也可以进行反序列化输入
不需要输入(反序列化)、输出(序列化)的字段,则不需要定义,定义的字段 则必须出现在 fields列表中
只需要反序列化输入,则定义 write_only = True
只需要序列化输出,则定义 read_only = True
响应的参数如果是多个查询集,需要在 JsonResponse()
中传参 many=True
label
:当前字段在前端的api页面中所显示的字段名称allow_null = False
:当前字段是否允许传None,默认是False(必填字段False,反之则True)allow_blank = False
:当前字段是否运行为空,默认是False(必填字段False,反之则True)required=False
:当前字段允许不传,默认是True(必填字段True,反之则False)
二、反序列化_校验机制
调用序列化器对象的 is_valid()
方法,校验前端参数的正确性,不调用则不校验
校验成功 返回True
、校验失败 返回False
is_valid(raise_exception = True)
:校验失败后,则抛出异常
当调用 is_valid()
之后,才能 调用 序列化器对象的 errors
属性,内容为校验的错误提示(dict)
在 views.py
中,如果传参进行了输入反序列化的话,那么需要调用的是经过校验后的数据,
比如说 :新增数据,应该是:xxx类.objects.create(**serializer.validated_data)
在视图集(ViewSet)中,REST
都默认调用了 is_valid()
方法来校验入参。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class CaseSerializer(serializers.ModelSerializer): config = ConfigSerializer() teststeps = StepSerializer(many=True, required=False) project_id = serializers.CharField(write_only=True) create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True) update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
class Meta: model = Case fields = ['config', 'teststeps', 'decs', 'project_id', 'file_path', 'create_time', 'update_time']
def create(self, validated_data): config_kws = validated_data.pop('config') project = Project.objects.get(pk=validated_data['project_id']) config = Config.objects.create(project=project, **config_kws) file_path = f'{project.name}_{config.name}.json' self.instance = Case.objects.create(config=config, file_path=file_path) return self.instance
def update(self, instance, validated_data): config_kws = validated_data.pop('config') project = Project.objects.get(pk=validated_data['project_id']) conf_serializer = ConfigSerializer(instance=instance.config, data=config_kws) if conf_serializer.is_valid(): conf_serializer.save() else: raise ValidationError(conf_serializer.errors)
steps_kw = validated_data.pop('teststeps') for kw in steps_kw: kw['belong_case_id'] = instance.id ss = StepSerializer(data=kw) if ss.is_valid(): ss.save() else: raise ValidationError(ss.errors)
instance.file_path = validated_data['file_path'] instance.desc = validated_data['desc'] instance.save() return instance
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class StepSerializer(serializers.ModelSerializer): testrequest = RequestSerializer() belong_case_id = serializers.IntegerField(write_only=True, required=False) class Meta: model = Step fields = ['name', 'variables', 'testrequest', 'extract', 'validate', 'teardown_hooks', 'setup_hooks', 'belong_case_id']
def create(self, validated_data): request_kws = validated_data['request'] serializer = RequestSerializer(data=request_kws) if serializer.is_valid(): request_obj = serializer.save() else: raise ValidationError(serializer.errors)
self.instance = Step.objects.create(testrequest=request_obj, **validated_data) return self.instance
|