`

django:DateTimeField如何自动设置为当前时间并且能被修改

阅读更多

        创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,表面上看起来很easy,但实际使用中很容易出错,下面是一些注意点。

DateTimeField.auto_now

这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的。

DateTimeField.auto_now_add

这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

django中的日期时间字段

admin中的日期时间字段

auto_now和auto_now_add被设置为True后,这样做会导致字段成为editable=False和blank=True的状态。editable=False将导致字段不会被呈现在admin中,blank=Ture表示允许在表单中不输入值。此时,如果在admin的fields或fieldset中强行加入该日期时间字段,那么程序会报错,admin无法打开;如果在admin中修改对象时,想要看到日期和时间,可以将日期时间字段添加到admin类的readonly_fields中:

class YourAdmin(admin.ModelAdmin):
    readonly_fields = ('save_date', 'mod_date',)
admin.site.register(Tag, YourAdmin)

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

那么问题来了。实际场景中,往往既希望在对象的创建时间默认被设置为当前值,又希望能在日后修改它。怎么实现这种需求呢?

django中所有的model字段都拥有一个default参数,用来给字段设置默认值。可以用default=timezone.now来替换auto_now=True或auto_now_add=True。timezone.now对应着django.utils.timezone.now(),因此需要写成类似下面的形式:

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

 

分享到:
评论

相关推荐

    django-datetime:使用 django 设置变量更改 django 进程的日期时间

    Django 提供了几个内置的字段类型用于处理日期和时间,如 `DateField`(仅日期)、`DateTimeField`(日期和时间)、`TimeField`(仅时间)和 `AutoNow`、`AutoNowAdd` 参数来自动更新创建或修改的时间戳。...

    django实现的一个mysql操作实例

    这个模型会自动生成一个名为`user`的表,包含`name`(字符型)、`email`(电子邮件字段,要求唯一)和`created_at`(自动添加当前时间戳的日期时间字段)。 **四、迁移(Migrations)** Django提供了迁移工具,用于...

    Django 自学学习笔记 超详细【二】

    publish字段被设置为DateTimeField类型,并通过default参数设置默认值为当前时间。最后,Meta类中的ordering属性用于指定默认的查询集排序方式,即按照发布的时间逆序排序。 第二步是根据数据模型建立数据库表文件...

    Python-轻松整合Django模型的常见行为

    为此,我们可以添加`created_at`和`updated_at`字段,通常设置为自动获取当前时间。Django并没有内置这个功能,但可以通过自定义模型方法或者使用第三方库如`django-model-utils`中的`TimeStampedModel`来实现。 ``...

    django rest framework serializer返回时间自动格式化方法

    在模型中,`create_time = models.DateTimeField(blank=True, auto_now_add=True, null=True)`表示创建时间字段,它会在创建新记录时自动添加当前时间,并允许为空。 当我们需要在序列化过程中格式化这个`create_...

    Django创建应用程序.pdf

    `date_added`是`DateTimeField`,记录主题创建的日期和时间,设置`auto_now_add=True`使得Django在创建新主题时自动填充当前时间。 为了使Django识别并使用我们的模型,我们需要在`settings.py`的`INSTALLED_APPS`...

    Django创建应用程序.docx

    `date_added`是`DateTimeField`,当新主题被创建时,其值会自动设置为当前时间,通过`auto_now_add=True`实现。 Django提供了`__str__()`方法,这是一个特殊方法,用于返回模型实例的字符串表示。在这里,`__str__...

    Django中日期处理注意事项与自定义时间格式转换详解

    `auto_now`参数的作用是在每次保存对象(Model.save())时自动将字段值设置为当前时间。这个参数适用于记录“最后修改时间”,如“last-modified”或“update_time”。然而,一旦设置了`auto_now=True`,该字段就...

    django model的update时auto_now不被更新的原因及解决方式

    `auto_now=True`意味着每当该模型实例被保存(即执行`save()`方法)时,该字段将自动设置为当前日期和时间。这是一种非常便捷的方式,可以帮助我们追踪模型对象的最后更新时间。 ##### 2.2 `update`与`save`的区别 ...

    django 在原有表格添加或删除字段的实例

    注意,对于日期时间类型字段(DateTimeField),如果设置了null=True,Django还会自动将字段的db_index设置为False。 4. 在命令行中执行makemigrations命令来创建迁移文件: ```shell python manage.py ...

    Mysql数据库反向生成Django里面的models指令方式

    在Django中,你可以使用`auto_now_add=True`来确保该字段在创建新记录时自动获取当前时间。如果数据库中的时间字段也是时间戳,那么它们应该匹配。在描述中,虽然没有给出完整的`time_sign_before_day`字段定义,但...

    django-tutorial:遵循Django Web应用程序框架教程

    这将在当前目录下创建一个名为`myproject`的目录,包含默认的项目结构。 ### 创建应用 在项目目录下,创建一个新的应用: ``` cd myproject python manage.py startapp myapp ``` `myapp`是你自定义的应用名,可以...

    详解Django model update的各种用法介绍

    这种方法更适合仅需更新单个实例的情况,并且如果模型中有`auto_now`属性的字段(如`DateTimeField`),使用此方法可以确保这些字段自动更新为当前时间。 对于`auto_now_add`和`auto_now`属性,`update()`方法不会...

    django中ORM模型常用的字段的使用方法

    - **auto_now_add**:当对象首次被创建时,自动将该字段的值设置为当前时间。通常用于表示对象创建时间。 **示例:** ```python class MyModel(models.Model): created_at = models.DateField(auto_now_add=True) ...

    Django-Model数据库操作(增删改查、连表结构)详解

    - `auto_now` 和 `auto_now_add`: 自动填充当前时间,前者在每次保存时更新,后者仅在创建时更新。 以上就是Django-Model数据库操作的详解,包括增删改查和连表结构的使用,以及各种字段类型的介绍。这些基础知识...

    CRUD-Operations:使用Django框架进行Crud操作

    `auto_now_add`和`auto_now`属性用于自动填充当前时间。 创建数据可以使用`save()`方法: ```python new_user = User(name='John Doe', email='john@example.com') new_user.save() ``` **读取(Retrieve)** 读取...

Global site tag (gtag.js) - Google Analytics