django——auto_now_add,auto_now,default=timezone.now
DateTimeField.auto_now
最后修改时间,字段会被“强制”更新到当前时间,无法在程序中手动为字段赋值。如果使用django再带的admin管理器,那么该字段在admin中是只读的。
DateTimeField.auto_now_add
创建时的时间,以后修改对象时,字段的值也不会再更新。无法在程序中手动为字段赋值。在admin中字段也会成为只读的。
场景:add_time 字段,默认为创建时间,也需要在某些更新时,重设时间;但是,某些更新时,不能更新时间。一个订单,计划中状态时,是创建时间;已完成状态时,需要更新时间;所以,这时候倾向于用 auto_now ,但是,在一些逻辑中改了某些数据时,并不希望时间改变,因为某个数据更改并不足以改变时间。如果用 auto_now,会被强制更新时间,导致逻辑混乱。所以,使用 default=timezone.now,在需要改变时间的时候,手动赋值,数据生成时,默认为创建时间。
from django.utils import timezone
add_time = models.DateTimeField(verbose_name='创建时间', default=timezone.now)
其他:
auto_now = True 自动更新,不起作用。
前端可以不填值:blank = 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
分类:
Django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现