如何避免mysql+django timefield在午夜自爆?

carvr3hs  于 2021-06-20  发布在  Mysql
关注(0)|答案(0)|浏览(216)

MySQL5.7.22(但早期版本也是如此)。Django1.8版本出现了这种情况,现在是Django1.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 具有类型 time 在mysql数据库中 DateTimeFielddatetime 以及 DateFielddate .
如果我用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 db type的分辨率仅为3毫秒,然后它会将其四舍五入到24:00:00,而不使用 Django 我知道。但我还不能证明这一点,我找不到这个问题的确切解决办法 time 但我觉得django有时显示的不可能是6个小数。如果是这样的话我应该手动 self.time = self.time_source.time.replace(microsecond=0) 或者别的什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题