Django中,所有对象都有一个默认的时间戳字段吗?也就是说,在我的模型中是否需要显式声明“创建时间”的“时间戳”字段,还是可以自动获取这个字段?
Django中,所有对象都有一个默认的时间戳字段吗?也就是说,在我的模型中是否需要显式声明“创建时间”的“时间戳”字段,还是可以自动获取这个字段?
默认情况下没有这样的功能,但添加一个非常简单。只需在 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)
"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):
....
model_utils
的模块,其中包含已经定义好的TimeStampedModel
类,但如果你不需要该模块中的其他内容,可以选择不使用以减轻代码负担。 - boldnik如果您正在使用 django-extensions (这是一个为 django-admin.py 命令行工具添加功能的优秀应用程序),则可以通过继承他们的 TimeStampedModel 或使用他们的自定义时间戳字段来免费获取这些模型字段。
如果您想使用时间戳抽象模型,可以尝试使用django-extensions。
from django_extensions.db.models import TimeStampedModel
class A(TimeStampedModel):
...
auto_now_add=True
:from datetime import date
models.DateField(default=date.today)
关于 DateTime
from django.utils import timezone
models.DateTimeField(default=timezone.now)
如果你在模型中使用了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"
我想我会选择
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
editable=False
并建议这样做,例如:created = models.DateTimeField(auto_now_add=True, editable=False)
。 - Williamsauto_now
或auto_now_add
选项会导致该字段也具有editable=False
,因此您不需要明确指定它。 - MoshiBin