热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django新增记录和数据验证

还请大家多多交流指正关于Django新增一条记录并对数据验证的方式,官方文档上是说数据验证分为三步分别为Model.clean_fields()Model.clean()Model

还请大家多多交流指正

关于Django新增一条记录并对数据验证的方式,官方文档上是说数据验证分为三步分别为

  1. Model.clean_fields()
  2. Model.clean()
  3. Model.validate_unique()

其中,
Model.clean_fields()验证字段比如长度格式等;
Model.clean()为自定义验证条件和报错信息;
Model.validate_unique()为验证添加的唯一性约束。
此三步验证可调用full_clean()来执行。
使用ModelForm对数据进行验证时可以使用is_valid()方法,此方法包含了以上的三步验证,但是使用save()方法时将不会自动验证。
所以,新增或修改记录使用save()方法前需要调用full_clean()方法。
另外,新增记录时如果使用create()似乎不会进行自定义的校验。个人尝试过在字段定义时未定义唯一约束,在自定义验证中判断是否唯一时未报错,验证方法如下,如有不当还请指正:

# 判断IP地址和设备名称是否唯一
def clean(self):
if self.ip_addr:
if Info.objects.filter(ip_addr__exact=self.ip_addr, status=True):
raise ValidationError(_(u'%s 此IP已被占用' % self.ip_addr))

if Info.objects.filter(equit_name__exact=self.equit_name, status=True):
raise ValidationError(_(u'%s 此设备已存在' % self.equit_name))

这样写新增记录的时候没问题,但是更新的时候使用form时如果用form.is_valid()方法校验会发生唯一性冲突,所以个人的解决方法时先判断IP和设备名称是否有变化,如果两个都有变化则使用form.is_valid()如果只有一个有变化就自行判断

因为需求上需要通过IP地址和状态判断唯一性,如果设备停用的状态下IP可以重新使用,设备名同样。如果有无IP的设备,如光纤收发器等,此时通过设备名进行判断是否唯一。
在Model中做此类校验会导致View中更新记录的时候报唯一性错误,因此把校验是否存在在用的同一IP或同一设备名称判断放在View中进行,校验的流程如下:

Created with Raphaël 2.2.0 开始 form表单或excel导入 IP不为空且存在此IP且此IP设备在用 存在此设备且设备在用 上级交换机IP存在且端口已占用且此设备当前状态在用 新增或修改记录 yes no yes no yes no

设备名称在Model中为必填字段,故用form.is_valid()full_clean()进行验证。修改记录部分校验代码:

# 错误信息默认为空
error_msg = ''
form = EquitForm(request.POST)
if form.is_valid():
# 判断是否有对IP进行修改
if equit.ip_addr != request.POST.get('ip_addr', ''):
if request.POST.get('ip_addr', ''):
if Equit.objects.filter(ip_addr__exact=request.POST.get('ip_addr', ''), status=True) and equit.status:
error_msg = u'IP地址已存在'
if equit.equit_name != request.POST.get('equit_name', ''):
if Equit.objects.filter(equit_name__exact=request.POST.get('equit_name', ''), status=True) and equit.status:
error_msg = u'该设备已存在'
if error_msg:
...
# 渲染界面,报错
else:
...
# 修改记录
else:
...
# 渲染界面,报错

推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
author-avatar
sexy-domey
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有