关于python:无法将datetimefield的默认值设置为”0000-00-00 00:00:00″

Unable to set default vale of DateTimeField to “0000-00-00 00:00:00”

1
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中添加默认值?


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

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

所以1月1日,1。在一些(大多数)数据库中,范围更为严格。例如,在MySQL中,范围是:

The DATE type is used for values with a date part but no time part.
MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format.
The supported range is '1000-01-01' to '9999-12-31'.

The DATETIME type is used for values that contain both date and time
parts. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD
HH:MM:SS'
format. The supported range is '1000-01-01 00:00:00' to
'9999-12-31 23:59:59'.

The TIMESTAMP data type is used for values that contain both date
and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC
to '2038-01-19 03:14:07' UTC.

MySQL确实有一个"零日期":

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the
"zero" value of the appropriate type ('0000-00-00' or '0000-00-00
00:00:00'
).

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

您可以使用这里提出的一个解决方案,它基本上构造一个新的django ZeroDateTimeField,将None映射到这个零值上。但据我所知,你不能用标准的DateTimeField来做这件事。

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