zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    批处理学习笔记9
    批处理学习笔记8
    批处理学习笔记10
    批处理学习笔记7
    批处理学习笔记6
    批处理学习笔记系列
    批处理学习笔记5
    批处理学习笔记3
    批处理学习笔记4
    批处理学习笔记2
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14230670.html
Copyright © 2011-2022 走看看