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

Django中如何重写save()方法

前言:

在Django的开发过程中,有时会需要我们重写save()方法来实现某些应用场景,下面来聊一聊如何重写save()方法以及一些注意事项

在model中重写

先抛出一个应用的场景:

  • 我们的模型用于存储文章,里面有文章标题内容创建时间修改时间
  • 需要在每次保存时更新修改时间

定义如下:

class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()created_time = models.DateTimeField(auto_now_add=True)updated_time = models.DateTimeField(null=True)

创建时间会在生成时自动生成,更新时间由我们编写逻辑,且允许为空


使用模板:

def save(self,*args,**kwargs):# 编写保存前的逻辑super().save(*args,**kwargs)# 编写保存后的逻辑

super().save(*args,**kwargs)是父类的保存逻辑
我们是在父类的保存逻辑基础上添加逻辑
不能舍弃父类的保存逻辑


现在的需求:由于修改时间是每一次保存的时候都需要更新,抓住关键词,保存[save()方法]。就可以翻译为每一次调用save()方法时都需要更新修改时间字段


需求明确了,那只需要在每次保存之前都把修改时间设置为当前时间即可

实现:

def save(self,*args,**kwargs):self.updated_time = timezone.now()super().save(*args,**kwargs)

测试:

article = models.Article(title='django中的save方法',content='这是内容')
article.save()

在这里插入图片描述
更新:

article = models.Article.objects.get(title='django中的save方法')
article.content = '这是修改的内容'
article.save()

在这里插入图片描述

注意:如果此处你使用.filter.update()更新数据,此时不会调用save()方法
为了演示此处用.get().字段名重新赋值调用save()方法演示

可以看见修改时间处已经更新

在ModelForm中重写

还是先抛出一个应用的场景:

  • 我们需要把不合规的昵称换为"系统昵称"
  • 需要在保存是检查昵称并进行操作

模版语法:

def save(self, commit=True):instance = super().save(commit=False)# ---- 此处编写保存逻辑# ----if commit:instance.save()return instance

补充讲解:

注意如果同时调用
instance.username

self.cleaned_data['username']

此时两个的值是一样的,因为在
instance = super().save(commit=False)
时,就是利用了cleaned_data创建的instance实例对象

因为保存的时候是instance.save(),所以保存到数据库的时候
是以instance的数据

结合我之前的一篇文章可以得出总结

Django表单数据处理cleaned_data[‘*‘]和instance.*获取/修改数据的区别

save方法中会利用cleaned_data创建实例对象
在创建实例对象之前:
修改cleaned_data数据会影响到数据库
创建实例对象后:
修改instance对象才会影响到数据库
所以在创建好instance对象后修改cleaned_data不会影响到数据库
因为保存到数据库中的是利用cleaned_data创建的实例对象,在创建好实例对象后再修改已经没用了


回到正题,此时
为代码添加如下操作

def save(self, commit=True):instance = super().save(commit=False)if instance.username == '不合规的昵称':instance.username = '系统昵称'if commit:instance.save()return instance

即可:
在这里插入图片描述

http://www.dtcms.com/a/597135.html

相关文章:

  • C在线编程 | 提升编程技能,掌握C语言的核心要点
  • 京东这样的网站怎么做网站建设费用怎么算
  • django模型数据查询
  • 佛山骏域网站建设软件开发价格标准
  • discuz企业网站一诺摄影设计
  • 基于微信小程序的特色农产品交易系统
  • 【windows常见问题】pin不可用,无法登录Windows
  • 免费正能量励志网站网站登陆界面怎么做
  • 网站建设找丿金手指排名在iis上部署的网站本机无法浏览解决方法
  • 【Android Studio】解决4K电视机上,网页无法适配的问题
  • 如何选择适合自动化的测试用例?
  • 一步一步网站建设教程联通 网站备案
  • 著名心理学导师钧岚确认出席2025厦门IP+AI万人峰会​
  • 10.游戏逆向-pxxx-UObjectBase成员解密
  • 触发器,存储过程
  • 计算点到三次 Bézier 曲线最短距离及对应参数 u 的方法(转化为五次多项式)
  • npm中-d -g 和默认安装的区别
  • 深圳商城网站建设报价单青岛网站建设的方案
  • AI 编程工具全景分析与 Claude Code 配置 MiniMax - m2 模型指南​
  • MES 生产调度模块:业务逻辑、功能细节与全场景落地
  • PG认证培训考试中心-CUUG【工信人才授权指定】
  • 研究院 网站建设云主机怎么装网站
  • 微网站模板代码电子商务实网站的建设课件
  • 55_AI智能体运维部署之实战经验:编写生产级Dockerfile的深度思考
  • 软件.PostgreSQL与StackBuilder及配置使用
  • web华为商城前端项目4页面
  • window命令行差外网ip
  • windows—wsl2—docker配置代理以push/pull
  • GSP药品温湿度监测要求详解:LoRaWAN技术在电池供电传感器中的应用优势
  • Docker学习笔记---day001