MySQL 5.7.22(但这也发生在早期版本中)。发生了Django 1.8,现在使用Django 1.11,MySQL和Django版本范围广泛。
class ShootFootAtMidnight(models.Model):
time = models.TimeField(blank=True, null=True)
time_source = models.ForeignKey(TimeSource)
def save(self, *args, **kwargs):
if self.time_source:
self.time = self.time_source.time
super(ShootFootAtMidnight, self).save(*args, **kwargs)
现在,如果在午夜时分创造了大量这些,我迟早会面对这个:
ValueError: hour must be in 0..23
请注意,因为这不是传统的models.DateTimeField
,但它只是time
部分。虽然对象也有DateTimeFields
,但auto_now
对我来说这个错误永远不会发生。 models.TimeField
在MySQL数据库中的类型为time
(DateTimeField
有datetime
而DateField
有date
。
如果我使用MySQL提示查看数据库,我会看到该对象是honky和dory创建的,时间为24:00:00
。此值不是来自auto_now
字段。 Django实际上创建了一个它无法读回的对象(?!?!?)。如果我手动将时间更正为23:59:59
ValueError: hour must be in 0..23
消失,但我该怎样才能防止这种情况发生?
这只是我的怀疑:这是MySQL方面的一个四舍五入的问题吗?也许Django框架提供了类似23:59:59:99934的东西。如果time
数据库类型的分辨率仅为3毫秒,那么它将在不知道Django
的情况下将其四舍五入到24:00:00。但我无法证明这一点,我无法找到time
的确切分辨率,但我觉得它不能是Django有时会显示的6个小数位数。如果是这种情况,我应该手动self.time = self.time_source.time.replace(microsecond=0)
或其他什么?