📜  django 模型中的自动日期时间 - Python (1)

📅  最后修改于: 2023-12-03 14:40:47.297000             🧑  作者: Mango

Django模型中的自动日期时间

在Django模型中,我们经常需要为某个字段记录创建或修改的时间。通常可以手动指定该值,但在许多情况下,我们希望它自动填充为当前日期和时间。本文介绍如何在Django模型中实现自动日期时间。

自动填充创建和修改时间

要在Django模型中自动填充创建或修改时间,可以使用 auto_now_addauto_now 属性。这两个属性都是 DateFieldDateTimeField 的选项,用于指示该字段的值是否应在创建或修改时自动填充为当前日期和时间。

  • 使用 auto_now_add 属性自动填充创建时间:
from django.db import models

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    # other fields...

在上面的例子中,created_at 字段的值将在创建时自动填充为当前日期和时间,并且不能手动修改。

  • 使用 auto_now 属性自动填充修改时间:
from django.db import models

class MyModel(models.Model):
    modified_at = models.DateTimeField(auto_now=True)
    # other fields...

在上面的例子中,modified_at 字段的值将在每次修改时自动填充为当前日期和时间。

使用信号自动填充时间

除了直接在模型中使用 auto_now_addauto_now 属性,我们还可以使用信号来自动填充日期时间。这种方法的好处是可以更加灵活地控制日期时间的填充。

首先,我们需要定义一个信号处理函数,用于在保存模型之前填充日期时间:

from django.utils import timezone

def fill_datetime(sender, instance, **kwargs):
    now = timezone.now()
    if not instance.pk:
        instance.created_at = now
    instance.modified_at = now

然后,我们需要使用Django信号 pre_save 以自动填充创建和修改时间。在模型文件中添加以下代码:

# 导入信号和相关模型
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

# 给 MyModel 模型添加 pre_save 信号
@receiver(pre_save, sender=MyModel)
def mymodel_pre_save(sender, instance, **kwargs):
    fill_datetime(sender, instance, **kwargs)

现在,每次保存 MyModel 实例时,都会自动填充 created_atmodified_at 字段为当前日期和时间。

总结

以上是在Django模型中自动填充日期时间的几种常用方式,包括直接使用auto_now_addauto_now 属性,以及使用信号来自动填充。选择合适的方式取决于情况和需求,但在任何情况下都应该使用良好的风格来记录时间信息。