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