ChatGPT解决这个技术问题 Extra ChatGPT

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

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


A
Aniruddh Agarwal

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

created = models.DateTimeField(auto_now_add=True)

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

对于 auto_now_add here

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

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,因此您无需明确指定它。
Y
Yuji 'Tomita' Tomita

自动听起来不像 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):
    ....

对于已经包含 TimeStampedModel 的 Django 也有 model_utils,但如果您不需要此包中的任何其他内容,只需保持它没有额外的重量。
@boldnik 我是简单的粉丝。
很酷...我有 3 个类需要 createdupdated 的时间戳。这是干净利落的好方法。
我真的很喜欢这个解决方案
T
Timmy O'Mahony

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


W
Wagh

你可以试试django-extensions

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

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

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


c
chaggy

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

日期

from datetime import date

models.DateField(default=date.today)

对于日期时间

from django.utils import timezone

models.DateTimeField(default=timezone.now)

R
Ralf

我想我会去

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

O
Olowu Abayomi

由于您可能在模型中使用 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"