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

时间:2018-10-29 09:33:04

标签: python django database django-models

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

models.py中的此字段会引发错误,如下所示:

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

如何在Django中添加默认值?

1 个答案:

答案 0 :(得分:2)

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

>>> datetime.min
datetime.datetime(1, 1, 1, 0, 0)

所以1月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确实有一个“零日期”:

  

无效的DATEDATETIMETIMESTAMP值被转换为   适当类型('0000-00-00''0000-00-00 00:00:00')的“零”值。

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

您可以使用提出的解决方案here,该解决方案基本上是构造一个新的Django ZeroDateTimeField来将None映射到该零值上。但是,据我所知,您可以不用标准的DateTimeField来做到这一点。

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