django model的update时auto_now不被更新的原因及解决方式


Posted in Python onApril 01, 2020

gmt_create自动添加auto_now_add;gmt_modify自动更新auto_now

class CommonInfo(models.Model):
"""基类,提供共同信息,不会创建真实的table"""

class Meta:
  # 声明自己为抽象基类
  abstract = True
  # 下面表示先根据更新时间gmt_modify降序排序,如果更新时间相同,再根据创建时间gmt_create降序排序
  ordering = ['-gmt_modify', '-gmt_create']

gmt_create = models.DateTimeField('创建时间,自动创建', auto_now_add=True, null=True, help_text='创建时间')
# 使用save可以达到自动更新的效果,使用update不会自动更新,因此需要携带上这个字段
gmt_modify = models.DateTimeField('更新时间,自动更新', auto_now=True, null=True, help_text='更新时间')

django的orm关于更新数据库的方法有update和save两种方法。

使用save时会自动更新

obj = User.objects.get(id=1)
obj.name='xxx'
obj.save()

save()时确实会自动更新当前时间

这是因为这个操作它经过了model层

使用update不会自动更新;因此需要在使用filter的update更新的时候同时赋值时间为datetime.datetime.now()

如果用django filter的update(通常为批量更新数据时)则是因为直接调用sql语句 不通过 model层

User.objects.filter(id=1).update(username='xxx')

补充知识:Django的auto_now=True没有自动更新

auto_now=True自动更新,有一个条件,就是要通过django的model层。

如create或是save方法。

如果是filter之后update方法,则直接调用的是sql,不会通过model层,

所以不会自动更新此时间。官方解释:

What you consider a bug, others may consider a feature, e.g. usingupdate_fieldsto bypass updating fields withauto_now. In fact, I wouldn't expectauto_nowfields to be updated if not present inupdate_fields.

解决办法:

强制改成save()或是update时,带上时间。

如下:

status_item = DeployStatus.objects.get(name=status_name)
  DeployImage.objects.filter(name=order_name).update(
    deploy_status=status_item,
    change_date=datetime.now())

  # 上面的操作,才会更新DeployImage表里的change_date(add_now=True)的时间,
  # 或是如下调用save()方法
  # deploy_item = DeployImage.objects.get(name=order_name)
  # deploy_item.deploy_status = status_item
  # deploy_item.save()

以上这篇django model的update时auto_now不被更新的原因及解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python批量导出导入MySQL用户的方法
Nov 15 Python
Python random模块常用方法
Nov 03 Python
从Python的源码来解析Python下的freeblock
May 11 Python
Python去除字符串两端空格的方法
May 21 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python 同时读取多个文件的例子
Jul 16 Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 Python
python能做哪些生活有趣的事情
Sep 09 Python
Django windows使用Apache实现部署流程解析
Oct 12 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 #Python
详解Python中pyautogui库的最全使用方法
Apr 01 #Python
django的模型类管理器——数据库操作的封装详解
Apr 01 #Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 #Python
Django数据库操作之save与update的使用
Apr 01 #Python
django model通过字典更新数据实例
Apr 01 #Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 #Python
You might like
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
在新窗口打开超链接的方法小结
2013/04/14 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
JavaScript的console命令使用实例
2019/12/03 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
python的id()函数介绍
2013/02/10 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python中encode()方法的使用简介
2015/05/18 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python实现类之间的方法互相调用
2018/04/29 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
土木建筑学生自我评价
2014/01/14 职场文书
给校长的建议书600字
2014/05/15 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis