实际问题
如何处理Django DateField和Mysql DATE类型中不同的最小日期。如何处理这个问题?
TL:DR
对于datetime.date.min类型,DATE的值低于Mysql中支持的最小值。将datetime.date.min保存到Mysql是可能的,但它不能保证工作正常。
上下文
我正在使用Django (v1.11)模型:
class MyModel(model.Model):
begin_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)目前,具有NULL值的字段分别指定了较低的日期范围限制和较高的日期范围限制。示例:
从开始到今天的日期如下:
mymodel.begin_date = None
mymodel.end_date = datetime.date(2019, 11, 20)
mymodel.save()None/NULL的使用需要在任何排序操作中将其转换为datetime.date.min/datetime.date.max。简单地说,它不方便,而且增加了不必要的复杂性。
我的想法是做必要的迁移,开始使用datetime.date.min/datetime.date.max而不是None/`NULL‘
但有一个问题:
Mysql有不同的min/max日期范围
根据mysql文档
日期类型用于日期部分的值,但不用于时间部分。MySQL检索并以‘YYYY DD’格式显示日期值.支持范围为“1000-01-01”到“9999-12-31”。
根据python文档:
在日期或日期时间对象中允许的最小年份数。MINYEAR是1。 日期或日期时间对象中允许的最大年份数。MAXYEAR为9999。 最早可代表的日期(MINYEAR,1,1)。 最新的可代表日期,日期(MAXYEAR,12,31)。
结果是,在Django中,仍然可以使用datetime.date.min,并将其保存到数据库中。,但它并不是起作用的大师。
因为:
对于日期和日期时间范围描述,“支持”意味着尽管早期的值可能有效,但无法保证。
我的想法
我正在考虑做所有必要的迁移,从None转换中清除代码,只使用Field.default。将其设置为default=datetime(1000, 1, 1) (最低mysql支持日期)
发布于 2019-11-21 07:33:27
我想你的主意会很好的。
但是请注意,它是特定于数据库的。使用None的更笨拙的方法确实具有跨数据库工作的优点。
还请注意,显然是MySQL,让我们将日期存储在表中的最小值以下。因此,数据库中的日期可能不会被筛选器捕获。因此,在存储日期之前,一定要验证日期,以确保它们处于或超过最小值。
https://stackoverflow.com/questions/58952005
复制相似问题