首先介绍一下相关概念
1. 自定义型: 继承rest_framework.serializers.Serializer
2. 模型类型: 继承rest_framework.serializers.ModelSerializer
构造方法:Serializer(instance=None, data=empty, **kwarg)
参数1,序列化必须传入的模型类对象
参数2,反序列化时把数据传入data
额外参数:例如context={‘XX‘:‘XX‘},可通过context属性获取, context上下文解析详解上面官方文档
1. 序列化时如果被序列化是多条查询集,通过添加many=True,列表形式
如果关联对象有多个,也可以在序列化器字段添加many=True
2. 如果模型类存在外键字段,处理方式如下:
①PrimaryKeyRelatedField,需设置read_only=True或queryser参数
被序列化后是关联字段数据
②StringRelatedField,被序列化是关联对象__str__返回值
③HyperlinkedRelatedField,需设置read_only,view_name
被序列化为关联对象数据的API链接
④SlugRelateField,需设置read_only,slug_field
被序列化后是关联对象的指定字段数据
⑤使用关联对象的序列化器类的实例
⑥重写to_representation 可修改被序列化后的返回值
验证:在反序列化时,对数据验证,验证成功后才可获取数据或保存为模型类对象
①调用is_valid方法验证,成功True,失败False
②验证失败时,通过序列化器对象的errors属性获取错误信息,返回字典包含字段和字段错误,如果非字段错误,可修改配置中NON_FIELD_ERRORS_KEY来控制键名
③验证成功时,通过序列化器对象的validated_date属性获取数据
注意点:带参数raise_exception=True在反序列化时is_valid()方法在验证失败时抛出serializers.ValidationError,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。
1. validate_字段名:在序列化器中添加方法,方法名validate_字段名,参数为value,对value做校验,raise
serializers.ValidationError(‘XXXX‘),返回值value
2. validate:在序列化器中添加validate方法,可同时对多个字段进行验证
参数为attrs,从attrs中获取值,然后进行逻辑处理,抛出异常,返回值attrs
3.validator:在序列化器上方编写函数,参数value,对value校验,抛出异常
在序列化器字段中加入validator选项参数,为列表形式,值为函数名。
4.REST framework提供的validators:
UniqueValidator单字段唯一:字段中设置,参数为queryset
UniqueTogetherValidation联合唯一:class Meta中设置,参数queryset和fields
保存:如果验证成功,向基于validated_data完成数据对象的创建,可以通过create和update来实现
1.新建:在序列化器中重写create方法,参数为validate_data,
返回值为模型类.objects.create(**validated_data)
2.更新:在序列化器中重写update方法,参数instance即要更新的实例和validate_data
对validate_data字典获取其值,对无传递值给予默认值 instance.字段,并赋给instance.字段,然后调用instance.save()提交,返回值instance
①实现了create和update方法后,在反序列化时既可以序列化对象.save()返回数据对象实例并保存或更新到数据库
②调用save时,如果有传instance实例,则调用update方法更新数据,否则调用create方法新建数据。
③调用save可传参,参数可从validated_data中获取
④如果没有传递所有required字段,会抛出验证异常,可通过使用partial=True实现部分字段更新
模型类序列化器ModelSerializer
可基于模型类自动生成一系列字段,会自动生成valiators和实现了默认的create和update方法
ModelSerializer 类似于 ModelForm 提供了一些便捷的方法,使你可以自动对 Django Model 中包含的部分或所有字段序列化。
用法上 ModelSerializer 和 Serializer 基本相同,除下面几点外:
关于序列化,之前在处理分页时已经使用过了。
这次通过一个用户信息列表及新增用户介绍一下ModelSerializer 在项目中的具体应用。
其他项目配置相关不做介绍,从创建models开始
# models.py from django.db import models # Create your models here. class UserInfo(models.Model): ‘‘‘用户信息表‘‘‘ # unique=True 限定唯一 username = models.CharField(verbose_name=‘用户名‘,max_length=32,unique=True) # 表单提交可为空,数据库存储可为 NULL blank=True, null=True nickname = models.CharField(verbose_name=‘名称‘, max_length=32,blank=True, null=True) telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name=‘手机号码‘) email = models.EmailField(max_length=64,blank=True, null=True, unique=True,verbose_name=‘email‘) password = models.CharField(verbose_name=‘密码‘, max_length=128) # 用户项目分组 usergroup = models.CharField(verbose_name=‘用户分组‘, max_length=128, null=True,blank=True) # 用户类型 usertype = models.CharField(verbose_name=‘用户类型‘, max_length=128, null=True,blank=True) avatar = models.ImageField(verbose_name=‘头像‘, upload_to=‘avatar‘, default="/avatar/default.png", null=True,blank=True) status = models.IntegerField(verbose_name=‘用户状态‘,default=1) userPermissions = models.CharField(verbose_name=‘用户权限‘,max_length=1024,null=True,blank=True) createTime = models.DateTimeField(verbose_name=‘创建时间‘, auto_now_add=True) updateTime = models.DateTimeField(verbose_name=‘修改时间‘,auto_now=True) description = models.TextField(verbose_name=‘备注‘,null=True,blank=True) class Meta: db_table = ‘UserInfo‘ verbose_name = ‘用户信息‘ verbose_name_plural = verbose_name def __str__(self): return self.username
在项目下创建序列化文件serializers.py 代码如下
注意:注意注释说明,fields、exclude 限定那些字段,那些字段将会被实例化或是不被实例化,如exclude = (‘password‘,),添加用户时,password 会被存储为空。
# FileName : serializers.py # Author : Adil # DateTime : 2019/8/20 4:58 PM # SoftWare : PyCharm # ~/AutomatedTest/TestPlatform/serializers.py from TestPlatform.models import UserInfo from rest_framework import serializers class UserInfoSerializer(serializers.ModelSerializer): class Meta: model = UserInfo fields = ‘__all__‘ # fields 属性设置为特殊值 ‘__all__‘,以指示应该使用模型中的所有字段。 实例化时将可以看到所有字段 # exclude = (‘password‘,) # 注意:结尾的 ‘,‘ 逗号,去掉会序列化失败。exclude 属性设置为从序列化程序中排除的字段列表。 实例化时将看不到 password 字段,及password 不被序列化, # fields = (‘username‘,‘password‘,‘email‘) # 序列化指定字段。 # exclude = [‘password‘] # 使用list 形式也是可以的,此时可以不要逗号。同理fields 也支持 list 形式,因为官网 就是 list形式。 # 本身ModelSerializer 它包含 .create() 和 .update() 的简单默认实现。 所以 这里 写不写 下面两个方法都行,但是在嵌套序列化 的情况下要 重写下面两个方法。 # def create(self, validated_data): # print("~~~~~~~~~~~~~~") # print(validated_data) # return UserInfo.objects.create(**validated_data) # # # def update(self, instance, validated_data): # # instance.name = validated_data.get(‘name‘,instance.name) # # # instance.save() # return instance
创建用户视图文件
# FileName : userviews.py # Author : Adil # DateTime : 2019/8/20 4:47 PM # SoftWare : PyCharm # 在应用下添加用户中心文件夹usercenter,并创建用户视图文件userviews.py # TestPlatform/usercenter/userviews.py from rest_framework.views import APIView from django.http import JsonResponse from rest_framework.request import Request from TestPlatform.models import UserInfo from TestPlatform.serializers import UserInfoSerializer class AddUserView(APIView): ‘‘‘添加用户‘‘‘ def post(self,request): ret = {‘code‘:1,‘msg‘:None,‘data‘:None} try: username = request.data.get(‘username‘,None) print(username) user_list = UserInfo.objects.all() # 序列化实例 ul = UserInfoSerializer(user_list,many=True) # 虽然是单个实例对象,many = True 还是要加的,不加报错。 print(ul) print(ul.data) # 根据接口提供参数 进行反序列化 ul1 = UserInfoSerializer(data=request.data) print("******") print(ul1) print(ul1.is_valid()) # 进行数据校验,通过返回True,失败返回False if ul1.is_valid(): print(ul1.validated_data) # 成功说明可以保存,调用 .save()保存实例到数据库。 ul1.save() ret[‘msg‘] = ‘成功!‘ ret[‘data‘] = ul1.data # return JsonResponse(ul1.data) else: ret[‘msg‘] = ‘失败!‘ # 失败返回失败信息。 ret[‘data‘] = ul1.errors except Exception as e: ret[‘code‘] = 0 ret[‘msg‘] = ‘失败!‘ return JsonResponse(ret)
配置应用下urls.py文件
# FileName : urls.py # Author : Adil # DateTime : 2019/8/19 4:48 PM # SoftWare : PyCharm # TestPlatform/urls.py from django.urls import path from TestPlatform.usercenter.userviews import AddUserView urlpatterns = [ # path(‘add/‘,add) path(‘adduser/‘,AddUserView.as_view()) ]
配置项目下主urls.py文件
# AutomatedTest/urls.py from django.contrib import admin from django.urls import path,include # from django.conf.urls import url,include urlpatterns = [ path(‘admin/‘, admin.site.urls), path(‘auto/‘,include(‘TestPlatform.urls‘))
注意:这样配置的接口路径为 auto/adduser/
启动项目,
添加用户,如图,添加了几个必填字段
添加重复用户,查看提示信息
查看数据库表
先简单介绍到这里,后续介绍一下,接口请求等相关知识。
Django restframework 序列化之 ModelSerializer 小记
原文:https://www.cnblogs.com/BlueSkyyj/p/11385874.html