Django新增记录和数据验证

本文介绍了在Django中进行数据验证的步骤,包括字段验证、自定义验证和唯一性约束,并强调了在使用`save()`方法时可能跳过的验证过程。新增或更新记录时,需要注意使用`full_clean()`进行完整验证。此外,对于有特定唯一性需求的场景,如IP和设备名称的唯一性约束,文章提出了解决方案,即在视图(View)层进行校验,以避免模型(Model)层的唯一性冲突。在处理设备停用和无IP设备的情况时,需灵活调整校验策略。
摘要由CSDN通过智能技术生成

还请大家多多交流指正


关于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中进行,校验的流程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值