Django新增记录和数据验证
还请大家多多交流指正
关于Django新增一条记录并对数据验证的方式,官方文档上是说数据验证分为三步分别为
Model.clean_fields()
Model.clean()
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中进行,校验的流程如下:
设备名称在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:
...
# 渲染界面,报错
本文来自博客园,作者:Splus,转载请注明原文链接:https://www.cnblogs.com/s-plus/p/15889933.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」