【问题标题】:In django do models have a default timestamp field?在 django 中,模型是否有默认时间戳字段?
【发布时间】:2026-01-16 13:30:01
【问题描述】:

在 django 中 - 是否有所有对象的默认时间戳字段?也就是说,我是否必须在我的模型中为“created on”显式声明一个“时间戳”字段 - 或者有没有办法自动获得这个?

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    默认情况下没有这样的东西,但是添加一个超级容易。只需在DateTimeField 类中使用auto_now_add 参数即可:

    created = models.DateTimeField(auto_now_add=True)
    

    您还可以将auto_now 用于“更新日期”字段。 检查auto_nowhere的行为。

    对于auto_now_addhere

    具有两个字段的模型如下所示:

    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)
    • 请注意,使用auto_nowauto_now_add 选项会导致该字段也具有editable=False,因此您无需明确指定它。
    【解决方案2】:

    自动听起来不像 django 默认会做的事情。它不会强迫您要求时间戳。

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

    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):
        ....
    

    【讨论】:

    • 还有 model_utils 用于 Django,其中已经包含 TimeStampedModel,但如果您不需要此包中的任何其他内容,只需保持它不增加重量。
    • @boldnik 我喜欢简单。
    • 很酷...我有 3 个类需要 createdupdated 的时间戳。这是干净利落的好方法。
    • 我真的很喜欢这个解决方案
    【解决方案3】:

    如果您使用django-extensions(这是一个为 django-admin.py 命令行帮助程序添加功能的好应用),您可以通过从their TimeStampedModel 继承或使用他们的custom TimeStamp fields 免费获得这些模型字段

    【讨论】:

      【解决方案4】:

      你可以试试django-extensions

      如果你想使用时间戳抽象模型

      from django_extensions.db.models import TimeStampedModel
      
      class A(TimeStampedModel):
         ...
      

      它还有其他抽象模型。你也可以使用它。

      【讨论】:

        【解决方案5】:

        如果您希望能够修改此字段,请设置以下内容而不是 auto_now_add=True:

        日期

        from datetime import date
        
        models.DateField(default=date.today)
        

        日期时间

        from django.utils import timezone
        
        models.DateTimeField(default=timezone.now)
        

        【讨论】:

          【解决方案6】:

          我想我会去的

          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
          

          【讨论】: