django restframework序列化字段校验规则

目录
  • 一、怎么校验创建的项目名是否是唯一的,当项目名name字段不唯一,怎么设置提示信息?
  • 二、项目名称中必须得包含“项目”2字
  • 三、单个字段进行校验:项目名称不能多于10个字
  • 四、多字段进行校验:
  • 五、to_internal_value方法,是所有字段开始进行校验时的入口方法(最先调用的方法)
  • 六、to_representation方法,是序列化输出的入口方法

一、怎么校验创建的项目名是否是唯一的,当项目名name字段不唯一,怎么设置提示信息?

class ProjectsSerializer(serializers.Serializer):
    create_time=serializers.DateTimeField(label='创建时间',help_text='创建时间',
                                          format='%Y年%m月%d日 %H时%M分%S秒',read_only=True)
    update_time = serializers.DateTimeField(label='更新时间', help_text='更新时间',
                                            format='%Y年%m月%d日 %H时%M分%S秒', read_only=True)
    name=serializers.CharField(label='项目名称',help_text='项目名词',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'项目名称不能少于3位',
                                               'max_length':'项目名称不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='项目名称不能重复')])

tip1:校验规则

1、可以在序列化器字段上使用validators指定自定义校验规则
2、validators必须得为序列类型(一般为列表),在列表中可以添加多个校验规则
3、DRF框架自带UniqueValidator校验器,必须得使用queryset指定查询集对象,用于对该字段进行校验
4、UniqueValidator校验器,可以使用message指定自定义报错信息
5、校验规则的执行顺序?
先对字段类型进行校验(CharField)——》依次验证validators列表中的校验规则——》从右到左依次验证其他规则——》调用单字段校验方法(如果有定义)

二、项目名称中必须得包含“项目”2字

def is_contains_keyword(value):
	is '项目' not in value:
		raise serializers.ValidationError("项目名称中必须包含'项目'关键字")

class ProjectsSerializer(serializers.Serializer):
    create_time=serializers.DateTimeField(label='创建时间',help_text='创建时间',
                                          format='%Y年%m月%d日 %H时%M分%S秒',read_only=True)
    update_time = serializers.DateTimeField(label='更新时间', help_text='更新时间',
                                            format='%Y年%m月%d日 %H时%M分%S秒', read_only=True)
    name=serializers.CharField(label='项目名称',help_text='项目名词',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'项目名称不能少于3位',
                                               'max_length':'项目名称不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='项目名称不能重复'),is_contains_keyword])

tip2:校验规则

1、可以在类外面自定义校验函数
2、第一个参数为待校验的值(name)
3、如果校验不通过,必须得抛出serializers.ValidationError(‘报错信息’)异常,同时可以指定具体得报错信息
4、需要将校验函数名放置到某一个字段的 validators列表中(不加括号)

三、单个字段进行校验:项目名称不能多于10个字

def is_contains_keyword(value):
	is '项目' not in value:
		raise serializers.ValidationError("项目名称中必须包含'项目'关键字")

class ProjectsSerializer(serializers.Serializer):
    create_time=serializers.DateTimeField(label='创建时间',help_text='创建时间',
                                          format='%Y年%m月%d日 %H时%M分%S秒',read_only=True)
    update_time = serializers.DateTimeField(label='更新时间', help_text='更新时间',
                                            format='%Y年%m月%d日 %H时%M分%S秒', read_only=True)
    name=serializers.CharField(label='项目名称',help_text='项目名词',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'项目名称不能少于3位',
                                               'max_length':'项目名称不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='项目名称不能重复'),is_contains_keyword])
	class Meta:
        model=Projects
        fields='__all__'

    def validate_name(self,attr:str):
    	if len(attr)>10:
    		raise serializers.ValidationError('项目名称不能多于10个字')
    	return attr

tip3:校验规则

1、可以在序列化器类中对单个字段进行校验
2、但字段得校验方法名称,必须把validate_作为前缀,加上待校验得字段名,如:validate_待校验得字段名
3、如果校验不通过必须得返回serializers.ValidationError(‘具体得报错信息’)
4、如果校验通过,往往将校验之后得值返回
5、如果该字段在定义时添加得校验规则不通过,那么是不会进行单字段校验的;如果能对单字段进行校验说明上面是校验通过的。
6、必须返回attr(当然如果不返回attr也不会报错)

四、多字段进行校验:

class RegisterModelSerializer(serializers.ModelSerializer):
    password_confirm = serializers.CharField(label='确认密码', help_text='确认密码',
                                             error_messages={"min_length": "允许输入5-20个字符",
                                                             "max_length": "允许输入5-20个字符", },
                                             write_only=True)
    token = serializers.CharField(label='token', help_text='token', read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'password', 'password_confirm', 'token', 'email']

    # 校验密码与验证码密码
    def validate(self, attrs):
        password=attrs.get('password')
        password=attrs.get('password_confirm')
        if password!=password_confirm:
        	raise serializers.ValidationError('密码和确认密码不一致')
        return attrs

tip4:校验规则

1、可以在序列化器类中对多个字段进行联合校验
2、使用固定得validate方法,会接受上面校验通过之后得字典数据
3、当所有字段定义时添加的校验规则都通过,并且每个字典得单字段校验通过得情况下,才会调用validate方法
4、必须返回attrs

五、to_internal_value方法,是所有字段开始进行校验时的入口方法(最先调用的方法)

class InterfacesSerializer(serializers.ModelSerializer):
	project=serializer.StringRelatedField(label='接口所属项目',help_text='接口所属项目',read_only=True)
	project_id=serializer.PrimaryKeyRelatedField(label='接口所属项目id',help_text='接口所属项目id',queryset=Projects.objects.all(),write_only=True)

	class Meta:
		model=Interfaces
		fields=['id','name','tester','project','create_time','desc','project_id']
		#exclude=['update_time']
		extra_kwargs={
			"create_time":{
				"read_only":True,
				"format":"%Y年%m月%d日 %H:%M:%S",
				}
		}

	def to_internal_value(self,data):
		result=super().to_intrenal_value(data)
		result['project_id']=result.get('project_id').id
		return result

六、to_representation方法,是序列化输出的入口方法

校验顺序为:首先对字段类型进行校验——》依次验证validators列表中的校验规则——》从右到左验证其他的校验规则——》调用单字段校验方法(如果有定义)——》调用多字段联合调用validate方法

到此这篇关于django restframework序列化字段校验规则的文章就介绍到这了,更多相关django restframework字段校验规则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django Admin实现上传图片校验功能

    Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然其他 Web 框架也声称能提供同样的内容,但 Django 的独特之处在于它内置了管理应用程序 -- admin. admin 提供了开箱即用的高级 Create-Read-Update-Delete (CRUD) 功能,减少了重复工作所需的时间.这是许多 Web 应用程序的关键所在,程序员可以在开发时快速浏览他们的数据库模型:非技术最终用户可以在部署时使用 admin 添

  • 在django中图片上传的格式校验及大小方法

    如下所示: Uploadfiles = request.FILES.get('参数', '') for i in Uploadfiles : # 图片大小的属性 i.size suffix = os.path.splitext(i.name)[1] if not suffix: return False elif suffix.lower() == '.jpeg' or suffix.lower() == ".png" or suffix.lower() == ".jpg&q

  • django免除csrf校验的方法

    免除csrf校验 在django中默认启动csrf校验,当用户发起post请求时,必须携带csrf_token参数.如果不想使用csrf校验时,可以使用以下方式免除校验.以下方式都是在局部中使用,如果想全局禁用时,需要在settings文件中配置,这种方式不推荐使用. 一.函数免除csrf校验 from django.views.decorators.csrf import csrf_exempt# 免除csrf校验@csrf_exempt def users(request): uses_li

  • Django csrf校验的实现

    引入: 通常,钓鱼网站本质是本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能 转账的请求确实是朝着正常网站的服务端提交,唯一不同的在于收款账户人不同. 如果想模拟一个钓鱼网站,就可是给用户书写一个form表单 对方账户的input框没有name属性,然后你自己悄悄提前写好了一个具有默认的并且是隐藏的具有name属性的input框. 如果想解决这个问题,当转账请求发送给服务端后,服务端会给各台机器返回一个随机实时字符串.下一次,如果还有请求向服务端发时,服务端会校验字符串,若对不上

  • Django框架登录加上验证码校验实现验证功能示例

    本文实例讲述了Django框架登录加上验证码校验实现验证功能.分享给大家供大家参考,具体如下: 验证码生成函数 pip install Pillow # /verify_code def verif_ycode(request): #引入绘图模块 from PIL import Image, ImageDraw, ImageFont #引入随机函数模块 import random #定义变量,用于画面的背景色.宽.高 bgcolor = (random.randrange(20, 100), r

  • Django之form组件自动校验数据实现

    一.form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确.如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.. Django form组件就实现了上面所述的功能. 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 二.普通方式手写注册功

  • django restframework序列化字段校验规则

    目录 一.怎么校验创建的项目名是否是唯一的,当项目名name字段不唯一,怎么设置提示信息? 二.项目名称中必须得包含“项目”2字 三.单个字段进行校验:项目名称不能多于10个字 四.多字段进行校验: 五.to_internal_value方法,是所有字段开始进行校验时的入口方法(最先调用的方法) 六.to_representation方法,是序列化输出的入口方法 一.怎么校验创建的项目名是否是唯一的,当项目名name字段不唯一,怎么设置提示信息? class ProjectsSerializer

  • Vue Element-ui表单校验规则实现

    目录 1.前言 2.规则校验的入门模式 2.1.示例代码 2.2.form项 2.3.prop项 2.4.rules项 2.5.rule项 2.6.使用规则 2.7.规则校验的核心 3.规则校验的进阶模式 3.1.嵌套对象属性名 3.2.自定义校验器validator 3.3.类型type 3.3.数据转换transform 3.4.数值范围Range 3.5.枚举值 3.6.正则Pattern 3.7.长度len 3.8.空白whitespace 3.9.i18n 4.规则校验的高级模式 4.

  • django restframework serializer 增加自定义字段操作

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现这个目的. 假设现在有一个Animal模型,其中有name, type, country字段,country为外键.我们在序列化Animal时,需要额外增加外键country的area信息. 方法一修改数据库,利用model 这里就不多解释,主要来说第二种,不修改django的model,直接使用S

  • Django框架序列化与反序列化操作详解

    本文实例讲述了Django框架序列化与反序列化操作.分享给大家供大家参考,具体如下: Serializer类 1.定义: Django REST framework中的Serializer使用类来定义,须继承rest_framework.serializers.Serializer. 例: class BookInfoSerializer(serializers.Serializer): """图书数据序列化器""" id = serialize

  • Django+RestFramework API接口及接口文档并返回json数据操作

    系统:ubuntu18.04 x64 GitHub:https://github.com/xingjidemimi/DjangoAPI.git 安装 pip install django==2.1.5 pip install djangorestframework # rest api pip install coreapi pygments markdown # 自动化接口文档 API示例 创建django项目 django-admin startproject DjangoAPI 创建应用

  • jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法

    先给大家分享数据校验显示效果 Web前端数据校验组件 Web项目中客户端与服务端的交互离不开Form表单,Form表单中最常用的元素莫过于input标签,input标签首先要用的肯定是text文本框啦! input文本框允许用户任意输入,难免会会有用户输入一些不符合规定的数据,此时,在提交之前对数据校验是很有必要的,如果等到提交到服务端再校验就会大大降低用户体验啦. 前端校验有很多现成的组件,比较好用的有 EasyUI 的 validatebox 插件,提示界面做的相当友好,只是validate

  • 在django中自定义字段Field详解

    Django的Field类中方法有: to_python() # 把数据库数据转成python数据 from_db_value() # 把数据库数据转成python数据 get_pre_value() # 把python数据压缩准备存入数据库 get_db_pre_value() # 把压缩好的数据转成数据库查询集 get_prep_lookup() # 指定过滤的条件 value_to_string() # 数据序列化 如果创建的Field比字符串,日期,整数等更复杂的数据结构,可能需要重写t

  • 简单了解Django ORM常用字段类型及参数配置

    这篇文章主要介绍了简单了解Django ORM常用字段类型及参数配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.数值型 AutoField对应int(11).自增主键,Django Model默认提供,可以被重写. BooleanField对应tinyint(1).布尔类型字段,一般用于记录状态标记. DecimalField对应decimal.开发对数据精准要求较高大的业务时考虑使用.比如:cash=models.DecimalFie

  • Springboot如何优雅地进行字段校验

    差不多大半年没写文章了,终于将手头上的事忙完了,可以对外输出了.前段时间提交代码审核,同事提了一个代码规范缺陷:参数校验应该放在controller层.到底应该如何做参数校验呢 Controller层 VS Service层 去网上查阅了一些资料,一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验.那么如何将参数校验写的优雅美观呢,如果都是if - else,就感觉代码写的很low,还好有轮子可以使用 常用校验工具类 使用Hibernate V

随机推荐