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
原文地址:https://www.cnblogs.com/pythonwl/p/14230670.html