在Django中,模型是否有默认的时间戳字段?

114

Django中,所有对象都有一个默认的时间戳字段吗?也就是说,在我的模型中是否需要显式声明“创建时间”的“时间戳”字段,还是可以自动获取这个字段?

7个回答

228

默认情况下没有这样的功能,但添加一个非常简单。只需在 DateTimeField 类中使用 auto_now_add 参数:

created = models.DateTimeField(auto_now_add=True)

你还可以使用auto_now来创建一个“更新于”字段。请在此处查看auto_now的行为。

请在此处查看auto_now_add的行为。

同时拥有这两个字段的模型如下:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

为了获得时间戳字段的“真实”体验,我添加了editable=False并建议这样做,例如:created = models.DateTimeField(auto_now_add=True, editable=False) - Williams
2
请注意,使用auto_nowauto_now_add选项会导致该字段也具有editable=False,因此您不需要明确指定它。 - MoshiBin

40

"Automagically"听起来不像是Django默认会做的事情。它不会强制要求您需要一个时间戳。

如果您不想忘记时间戳/字段名称等信息,我建议构建一个抽象基类并从中继承所有模型。

(注:本翻译保留了原文中的 "Automagically" 一词,因其为英语俚语,难以直接翻译,但在上下文中表达了 "自动完成某项操作" 的意思)

class TimeStampedModel(models.Model):
     created_on = models.DateTimeField(auto_now_add=True)

     class Meta:
         abstract = True

导入wherever.TimeStampedModel似乎并不比导入django.db.models.Model多做什么。

class MyFutureModels(TimeStampedModel):
    ....

3
Django还有一个名为model_utils的模块,其中包含已经定义好的TimeStampedModel类,但如果你不需要该模块中的其他内容,可以选择不使用以减轻代码负担。 - boldnik
@boldnik 我喜欢简单。 - Yuji 'Tomita' Tomita
非常棒...我有3个类需要一个时间戳来记录“创建”和“更新”的时间。这是一种非常干净的实现方式。 - ron_g

14

6

如果您想使用时间戳抽象模型,可以尝试使用django-extensions

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

它还有其他抽象模型,您也可以使用它们。

2
如果您想修改此字段,请设置以下内容,而不是使用 auto_now_add=True
对于日期类型:
from datetime import date

models.DateField(default=date.today)

关于 DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

1

如果你在模型中使用了ID,那么这种方式是安全的。

from django.db import models
from uuid import uuid4


class TimeStampedModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

然后在任何您想要使用它们的模型中导入 TimeStampedModel,例如:

class Detail(TimeStampedModel):
   first_name = models.CharField(max_length=100)
   last_name = models.CharField(max_length=100)

   class Meta:
       verbose_name = "Detail"
       verbose_name_plural = "Details"

0

我想我会选择

created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

我需要一些关于使用的澄清。

class TimeStampedModel(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
         abstract = True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接