• Django中的日期和时间、DateField.auto_now、DateField.auto_now_add


    前言

    创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三种对象。这三个field有着相同的参数auto_now和auto_now_add,在实际使用中很容易出错。

    DateField

    class DateField(auto_now=False, auto_now_add=False, **options)  # 默认

    日期,由 datetime.date 实例在Python中表示。有一些额外的可选参数(下面的有总结)

    DateTimeField

    class DateTimeField(auto_now=False, auto_now_add=False, **options)

    日期和时间,由Python在 datetime.datetime 实例中表示。采用与 DateField 相同的额外参数。

    TimeField

    class TimeField(auto_now=False, auto_now_add=False, **options)

    一个时间,在Python中由 datetime.time 实例表示。接受与 DateField 相同的自动填充选项。

    关键点:auto_now和auto_now_add

    DateField.auto_now

    每次保存对象时,自动将字段设置为现在。用于“最后修改”的时间戳。注意当前日期是使用 always;它不只是一个默认值,你可以覆盖。

    该字段仅在调用 Model.save() 时自动更新。在以其他方式(例如 QuerySet.update())更新其他字段时,不会更新该字段,但您可以在此类更新中为字段指定自定义值。

    DateField.auto_now_add

    在首次创建对象时自动将字段设置为现在。用于创建时间戳。注意当前日期是使用 always;它不只是一个默认值,你可以覆盖。因此,即使在创建对象时为此字段设置了一个值,它也将被忽略。如果您想要修改此字段,请设置以下内容而不是 auto_now_add=True

    • 对于 DateFielddefault=date.today - 来自 datetime.date.today()

    • 对于 DateTimeFielddefault=timezone.now - 来自 django.utils.timezone.now()

    选项 auto_now_addauto_nowdefault 是互斥的。这些选项的任何组合将导致错误

    注解
    按照目前的实现,将 auto_now 或 auto_now_add 设置为 True 将使该字段具有 editable=False 和 blank=True 设置。
    注解
    
    auto_now 和 auto_now_add 选项将始终在创建或更新时使用 默认时区中的日期。
    如果你需要不同的东西,你可能想考虑简单地使用自己的可调用的默认值或覆盖 save(),
    而不是使用 auto_now 或 auto_now_add;或者使用 DateTimeField 而不是 DateField
    并且决定如何处理在显示时间从日期时间到日期的转换。

    常见问题:如何将创建时间设置为“默认当前”并且可修改

    在现实生产环境中,往往希望对象的创建时间默认设置为当前值,但又希望日后可以修改它,如何实现这种需求的呢。

    django中所有的model字段都拥有一个default参数,用来给字段设置默认值(上面的文档中有介绍)。

    我们可以使用default=timezone.now()来替换auto_now=Trueauto_now_add=True

    default=timezone.now 对应 django.utils.timezone.now()

    from django.db import models
    import django.utils.timezone as timezone
    class Test(models.Model):
        add_date = models.DateTimeField('保存日期',default = timezone.now)
        mod_date = models.DateTimeField('最后修改日期', auto_now = True

    html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2018-06-25 22:00:00,但是页面显示的却是Apr. 25, 2018, 10 p.m.

    为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td>{{ infor.updatetime|date:"Y-m-d H:i:s" }}</td> 类似的过滤器。刷新页面,即可正常显示。

  • 相关阅读:
    2,HTTP请求应答返回码
    1,http协议的细节部分学习
    外包人员面试南航项目功能测试中级-面试总结
    产品线上问题记录一:启动页仅记录时间未检查升级,导致不能弹出自动更新弹窗
    飞机订票-4随机删除票务
    【登录、添加、删除、查询、文本框、各种按钮/框控件、查找替换插入剪切复制粘贴】功能测试用例
    飞机订票-2登录成功脚本
    Matlab-4:追赶法(crout分解)工具箱
    <Matlab-3:追赶法(Doolittle分解)工具箱
    Matlab-2:二分法工具箱
  • 原文地址:https://www.cnblogs.com/fixdq/p/9226588.html
Copyright © 2020-2023  润新知