如何在 Django 模型中将当前时间设置为“TimeField()”作为默认值?

How to set the current time to "TimeField()" as a default value in Django Models?

提问人:Super Kai - Kazuya Ito 提问时间:5/28/2023 最后编辑:Super Kai - Kazuya Ito 更新时间:6/2/2023 访问量:350

问:

文档在下面DateField.auto_now_add说:

在首次创建对象时自动将字段设置为现在。...如果希望能够修改此字段,请设置以下内容而不是:auto_now_add=True

  • 为:DateFielddefault=date.today - from datetime.date.today()
  • 为:DateTimeFielddefault=timezone.now - from django.utils.timezone.now()

因此,对于 DateField() 和 DateTimeField(),我可以分别将当前日期和时间设置为默认值,如下所示:

from datetime import date
from django.utils import timezone

class MyModel(models.Model):
    date = models.DateField(default=date.today) # Here
    datetime = models.DateTimeField(default=timezone.now) # Here

现在,如何将当前时间设置为TimeField()作为默认值,如下所示?

class MyModel(models.Model):       # ?
    time = models.TimeField(default=...)
python django 日期时间 django-models 默认

评论


答:

0赞 Super Kai - Kazuya Ito 5/28/2023 #1

您可以将 time zone.now().time() 设置为默认值,如下所示。*不要设置 with,因为默认时间是 Django 服务器启动时(不变):current_time()current_time()()

from django.utils import timezone

def current_time(): # Here
    return timezone.now().time()

class MyModel(models.Model): # Don't set "current_time()"
    time = models.TimeField(default=current_time)

请注意,不要将 to 设置为默认值,如下所示,因为默认时间是 Django 服务器启动时(不变):timezone.now().time()()TimeField()

from django.utils import timezone

class MyModel(models.Model): # Don't set "timezone.now().time()"
    time = models.TimeField(default=timezone.now().time())

而且,不要将 without to 设置为默认值,如下所示,因为运行时会出现错误:timezone.now().time()TimeField()python manage.py makemigrations

from django.utils import timezone

class MyModel(models.Model): # Don't set "timezone.now().time"
    time = models.TimeField(default=timezone.now().time)

此外,我不建议使用 DateField(),因为它们不能像我问的那样TIME_ZONE 一起使用,而 DateTimeField() 可以。TimeField()settings.py

1赞 willeM_ Van Onsem 5/28/2023 #2

您可以使用可调用对象

from django.utils import timezone


def current_time():
    return timezone.now().time()


class MyModel(models.Model):
    time = models.TimeField(default=current_time)

每次定义一个新的并且时间没有传递时,它将调用该方法,从而返回当前(时区时间)的时间分量。MyModelcurrent_time

重要的是不要使用括号,所以 ,而不是 default=current_time()。default=current_time