当前位置: 首页 > 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.gsyq.cn/news/76530.html

相关文章:

  • 2025年口碑好的智能制冷压缩机/活塞式制冷压缩机厂家推荐及选购指南
  • 2025年比较好的钢材/Q235钢材厂家最新用户好评榜
  • 2025年质量好的RJ45插座网线连接器/RJ45插座连接器带灯厂家最新热销排行
  • 2025年评价高的不锈钢烧烤网厂家最新实力排行
  • 负载均衡 四层 七层 F5 nginx LVS HAproxy gateway详解
  • 2025年比较好的品质家纺热门畅销优选榜
  • 2025年靠谱的彩色橡塑管厂家推荐及采购指南
  • 2025年质量好的钛金一字铰链厂家最新热销排行
  • Flask进阶必备:掌握中间件、钩子和扩展
  • 2025年质量好的续航长的电动车电池厂家最新实力排行
  • 2025年靠谱的玉米磨面机厂家推荐及选购参考榜
  • 2025年质量好的铸石板衬板厂家最新推荐排行榜
  • 2025年12月江苏新沂U型槽品牌推荐前十强分析
  • 2025年下半年北京NPDP培训机构综合评估与选择指南
  • 2025年评价高的深睡凝胶枕/凝胶枕高评价厂家推荐榜
  • 2025年下半年江苏徐州电表箱品牌推荐前十指南
  • 2025年下半年江苏新沂盖板品牌精选推荐前五指南
  • 苏州地区月嫂保姆护工服务公司2025年12月排行榜
  • C#实现三菱MC通讯协议库(4C帧-格式1) - Dragonet
  • 2025年口碑好的多媒体展厅/展厅权威排行榜
  • 2025年靠谱的污水处理厂压滤机厂家最新推荐权威榜
  • 2025年知名的高压电力电缆厂家推荐及选择指南
  • 2025年评价高的电气防火限流式保护器厂家最新TOP实力排行
  • 2025年靠谱的碳纤维装饰片材/碳纤维复合板材厂家推荐及采购指南
  • 2025年热门的人形机器人超薄电机绝缘用户好评厂家排行
  • 2025年热门的新型建材高评价厂家推荐榜
  • debian install kubectl
  • 2025年下半年上海卧式砂磨机厂家推荐前十强综合指南
  • 2025年下半年上海水溶肥设备厂家服务对比推荐榜单
  • 2025下半年徐州MPP电力管优质供应商综合评估与选择指南