无法将 DateTimeField 的默认值设置为“0000-00-00 00:00:00”

shr*_*tti 2 python database django django-models

fld_date_time = models.DateTimeField(db_column='FLD_DATE_TIME', blank=True, null=True, default="0001-00-00 00:00:00")
Run Code Online (Sandbox Code Playgroud)

models.py 中的该字段抛出错误:

[“'0000-00-00 00:00:00'值具有正确的格式(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]),但它是无效的日期/时间。” ]

如何在django中添加默认值?

Wil*_*sem 5

问题是你的默认值没有意义。没有第零天,也没有第零月。Python 可以表示为对象的最小日期datetime是:

>>> datetime.min
datetime.datetime(1, 1, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)

所以 1 月 1 日。在一些(大多数)数据库中,该范围甚至更具限制性。例如,在MySQL中,范围是:

DATE类型用于包含日期部分但不包含时间部分的值。MySQL 以格式检索并显示DATE'YYYY-MM-DD'。支持的范围'1000-01-01''9999-12-31'

DATETIME类型用于包含日期和时间部分的值。MySQL 以格式检索并显示DATETIME'YYYY-MM-DD HH:MM:SS'支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'

TIMESTAMP数据类型用于包含日期和时间部分的值。TIMESTAMP范围为'1970-01-01 00:00:01'UTC 到'2038-01-19 03:14:07'UTC

MySQL确实有“零日期”:

无效的DATEDATETIME、 或TIMESTAMP值将转换为适当类型的“零”值('0000-00-00''0000-00-00 00:00:00')。

但是没有好的方法可以将其包装到datetime对象中,因为如前所述,它超出了可表示的范围。

您可以使用此处提出的解决方案,该解决方案基本上构造一个新的 DjangoZeroDateTimeField来映射None此零值。但据我所知,您可以不使用标准来执行此操作DateTimeField

datetime因此,您可以使用数据库可表示的最小可表示对象,也可以使用NULL它。