如何避免MySQL + Django TimeField在午夜时分在脚下拍摄?

时间:2018-06-15 18:19:44

标签: python mysql django time django-models

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数据库中的类型为timeDateTimeFielddatetimeDateFielddate

如果我使用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)或其他什么?

0 个答案:

没有答案