关于python:Django DateField默认选项

Django DateField default options

我有一个具有日期时间字段的模型:

1
date = models.DateField(_("Date"), default=datetime.now())

当我在内置的django admin中检查该应用程序时,dateField还附加了时间,因此如果您试图保存它,它会返回一个错误。如何使默认值仅为日期?(datetime.today()也不工作)


这就是为什么您应该始终导入基本的datetime模块:import datetime,而不是该模块中的datetime类:from datetime import datetime

您犯的另一个错误是使用()在默认情况下实际调用函数。这意味着所有模型都将在第一次定义类时获得日期——因此,如果服务器在没有重新启动Apache的情况下保持运行数天或数周,那么所有元素都将获得相同的初始日期。

所以字段应该是:

1
2
import datetime
date = models.DateField(_("Date"), default=datetime.date.today)


您错误地使用了日期时间模块而不是日期模块。你想这样做:

1
2
from datetime import date
date = models.DateField(_("Date"), default=date.today)

如果只想捕获当前日期,正确的处理方法是使用auto_now_add参数:

1
date = models.DateField(_("Date"), auto_now_add=True)

但是,modelfield文档清楚地声明auto-now和auto-now将始终使用当前日期,并且不是可以覆盖的默认值。


1
date = models.DateTimeField(default=datetime.now, blank=True)


这应该可以做到:

1
models.DateTimeField(_("Date"), auto_now_add = True)


您也可以使用lambda。如果您正在使用django.utils.timezone,则非常有用。

1
date = models.DateField(_("Date"), default=lambda: now().date())


我认为解决这个问题的更好方法是使用日期时间可调用:

1
2
3
from datetime import datetime

date = models.DateField(default=datetime.now)

注意,没有使用括号。如果使用括号,则只需调用一次now()函数(在创建模型时)。相反,您将可调用作为参数传递,因此每次创建模型实例时都会调用它。

归功于姜戈沉思。我已经用过了,而且工作得很好。