当前位置: 首页 > news >正文

高端网站 设计苏州市建设局网站

高端网站 设计,苏州市建设局网站,个人网站可以做论坛么,郑州品牌策划设计公司版本 sqlalchemy1.4.37 需求说明 有个场景#xff0c;需要在orm中对两个字段进行联合校验#xff0c;当 col1 xxx’时#xff0c;对 col2的长度进行检查#xff0c;超过限制#xff08;500#xff09;时#xff0c;进行截断。 网上找了很久#xff0c;没找到类似的…版本 sqlalchemy1.4.37 需求说明 有个场景需要在orm中对两个字段进行联合校验当 col1 xxx’时对 col2的长度进行检查超过限制500时进行截断。 网上找了很久没找到类似的实现自己摸索出来了一套方法 解决 在 validates 装饰器中它是在设置字段值之前被调用的validates 包装的函数校验完成后通过return赋值给字段 validates 的执行顺序 看起来是和 字段 传入ORM模型的顺序 一样。 如 下面案例 中的 model_instance 中如果 col1 在 col2 之前就会先校验和赋值 col1 反之则先校验和赋值 col12 方案1 保证 model_instance 中 字段 col1 在 col2 之前这样会先校验和赋值 col1 在校验 col2 时self.col1 就不会为空能正常进行校验。 如果先赋值col2在 validate_col2 中会self.col1会为None导致校验失败 from sqlalchemy.orm import validates from sqlalchemy import Column, String, Integer from sqlalchemy.ext.declarative import declarative_baseBase declarative_base()class MyModel(Base):__tablename__ my_modelid Column(Integer, primary_keyTrue)col1 Column(String(50))col2 Column(String(500)) # 假设col2的最大长度是500个字符validates(col2)def validate_col2(self, key, value):# 检查col1的值是否为xxxif self.col1 xxx:# 如果col1是xxx则校验col2的长度if len(value) 500:value value[:500]# 如果col1不是xxx可以选择不做任何操作或者添加其他逻辑return value # 示例使用1 # 先赋值 col1 再赋值 col2 model_instance MyModel() model_instance.col1 xxx # 假设这是触发条件的值 model_instance.col2 a * 501 # 这将触发长度校验# 示例使用2 datas {col1 xxx, col2: a * 501 } # 先pop删除再添加就不管前面datas是怎么来的可以保证 datas 中 col2会比col1后遍历到 _col2_v datas.pop(col2) datas[col2] _col2_v model_instance MyModel(**datas )try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass except ValueError as e:print(e)方案2 实例化orm模型后再调用一遍 validate_col2 校验并赋值给col2 from sqlalchemy.orm import validates from sqlalchemy import Column, String, Integer from sqlalchemy.ext.declarative import declarative_baseBase declarative_base()class MyModel(Base):__tablename__ my_modelid Column(Integer, primary_keyTrue)col1 Column(String(50))col2 Column(String(500)) # 假设col2的最大长度是500个字符validates(col2)def validate_col2(self, key, value):# 检查col1的值是否为xxxif self.col1 xxx:# 如果col1是xxx则校验col2的长度if len(value) 500:value value[:500]# 如果col1不是xxx可以选择不做任何操作或者添加其他逻辑return value # 示例使用1 # 先赋值 col1 再赋值 col2 model_instance MyModel() model_instance.col1 xxx # 假设这是触发条件的值 model_instance.col2 a * 501 # 这将触发长度校验# 示例使用2 datas {col1 xxx, col2: a * 501 }model_instance MyModel(**datas ) # 上面实例化会自动调用所有的 validates 函数下面再调用一遍validate_col2, # 并且要用 model_instance.col2 接收返回值不然 model_instance.col2 的值不会改变。 model_instance.col2 model_instance.validate_col2(col2, datas[col2])try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass except ValueError as e:print(e)方案3 无法保证 model_instance 中 字段 col1 在 col2 之前的顺序采用 临时变量 __col1存储 col1 的值并对 col2 进行二次校验赋值 在 validate_col1 函数中校验 col1先把 value 值就是没校验前的col1的值赋给 self.__col1然后再调用 validate_col1_and_col2 进行联合校验最后通过 return把value赋值给 self.col1 在整个过程中validate_col1_and_col2 会被调用3次 校验 col2 时validate_col2 会调用一次校验 col1 时self.col2 self.validate_col1_and_col2(keycol2, valueself.col2) 这一行会调用两次: 一次是 self.validate_col1_and_col2 执行另一次是 1 执行完后对 self.col2 赋值会调用一次 validate_col2 进而再调用一次 from sqlalchemy.orm import validates from sqlalchemy import Column, String, Integer from sqlalchemy.ext.declarative import declarative_basedef getStrLenAndTruncate(ss: str, max_length500):获取字符串长度超过部分截断:param ss::param max_length::return:slen len(ss.encode(utf-8))# 如果编码后的字符串长度小于或等于500字节则不需要截断if slen max_length:return ss# 截断到500字节的长度注意这里直接截断可能会导致字符不完整# 因此需要找到一个合适的截断点确保截断后的字符串是完整的utf-8字符truncated_encoded bcurrent_length 0for char in ss:char_encoded char.encode(utf-8)if current_length len(char_encoded) max_length:truncated_encoded char_encodedcurrent_length len(char_encoded)else:breaktruncated_str truncated_encoded.decode(utf-8, errorsignore)print(f原字符串编码后长度为{slen}, 超过限制{max_length}, 需进行截断\n原字符串{ss}, \n截断后字符串:{truncated_str})return truncated_strBase declarative_base()class MyModel(Base):__tablename__ my_model__col1 id Column(Integer, primary_keyTrue)col1 Column(String(50))col2 Column(String(500)) # 假设col2的最大长度是500个字符validates(col1)def validate_col1(self, key, value):self.__col1 valueself.col2 self.validate_col1_and_col2(keycol2, valueself.col2)return valuevalidates(col2)def validate_col2(self, key, value):value validate_col1_and_col2(key, value)return value def validate_col1_and_col2(self, key, value):# 检查col1的值是否为xxxif self.__col1 xxx:if not value:value elif len(value) * 3 500:# 存储到 oracle中文占3个字符passelse:print(需检查 col2 长度)value getStrLenAndTruncate(value)return value# 示例使用 datas {col1 xxx, col2: a * 501 } model_instance MyModel(**datas )try:# 假设这是保存模型到数据库的代码# session.add(model_instance)# session.commit()pass except ValueError as e:print(e)说明 为啥不省略下面这个 validate_col2 这个校验代码 validates(col2)def validate_col2(self, key, value):value validate_col1_and_col2(key, value)return value 因为 这个方案中col1 、col2进入 orm模型的顺序不一定如果省略了validate_col2 当col1比col2先进入模型那么在 validate_col1 调用 self.validate_col1_and_col2(keycol2, valueself.col2) 时self.col2其实等于None此时对col2校验是没有意义的。等到 col2 进入 orm模型又缺少对它进行校验的函数。 注意 不能在 某个字段的校验函数中对其进行赋值操作不然会陷入递归循环因为赋值操作会调用校验函数 如下面的调用会陷入递归死循环因为 self.col1 value 这行代码对 self.col1 进行了赋值会自动再次调用validate_col1校验函数就会在这一行陷入递归死循环而报错。 class MyModel(Base):validates(col1)def validate_col1(self, key, value):self.__col1 valueself.col1 valueself.col2 self.validate_col1_and_col2(keycol2, valueself.col2)return value 其他方案 不走orm模型直接写校验代码和原生sql处理。 最后 这就是我尝试出来的 在 sqlalchemy.orm中validates对两个字段进行联合校验的方法总感觉不太完美不知道有没有大佬知道更好的方案欢迎分享
http://www.pierceye.com/news/715719/

相关文章:

  • 效果好的徐州网站开发建设网站怎么学
  • 上海网站设计要多少钱建设银行个人网站打不开
  • 哪个网站做欧洲旅行比较好东营网站制作
  • 做pc端网站效果wordpress js 添加图片
  • 给装修公司做网站商标设计大全
  • 深圳做网站公司有哪些地方国际形势最新消息
  • 企业网站建设管理平台石家庄平山网站推广优化
  • 免费asp网站模板带后台网站建设需求调研通知
  • 浙江二建建设集团有限公司网站微信哪里可以做视频网站
  • wordpress阿里百秀5.2广州网站排名专业乐云seo
  • 网站建设 上海网站福州最好的网站建设公司
  • 兴力网站建设企业宣传网站在哪里做
  • 网站了建设pc官网 和手机网站
  • wordpress导航网站模板下载wordpress 关闭搜索引擎
  • 网站架构的优化wordpress企业主题免费下载
  • 分类信息网站手机版自学编程从哪学起
  • 网站目录 index.html京伦科技网站做的怎么样
  • 学做简单网站视频教程济源建设网站
  • 一个网站开发成本网店推广方案范文
  • 为什么要做seo盐城网站优化
  • 网站策划方案ppt站长查询域名
  • 网站开发需要哪些流程wordpress 添加widget
  • 在线报名网站建设汉字logo设计生成器
  • 移动网站和桌面网站区别烟台网站设计制作公司电话
  • 遵义网站建设网站定制wordpress主题多少钱
  • 外贸网站如何做推广是什么意思长沙制作公园仿竹护栏多少钱一米
  • seo网站有优化培训吗小程序商城开发华网天下优秀
  • 无锡品牌网站建设介绍网络营销是不是网络推广
  • 旅游网站建设论文题目商用图片的网站
  • 做网页专题 应该关注哪些网站网页版梦幻西游吸血鬼怎么过