2

我正在使用 mysql 5.7 db 和 django 1.8,据我所知,它们都支持毫秒。我可以通过 mysql 以 HH:MM:SS.fff 的形式将时间输入到我的数据库中。(例如 00:05:45:100)

当我打开 django 的管理页面时,它会正确显示时间(例如 00:05:45:100000),但是如果我通过管理表单输入时间并按“保存”,时间会变为例如 00:05:45: 000000 所以毫秒不会像我认为的那样被保存

为什么会这样,有没有办法改变它?谢谢

管理员.py

from django.contrib import admin
from items.models import Maximum
from django import forms

class MaximumAdminForm(forms.ModelForm):
    def __init__(self, *arg, **kwargs):
        super(MaximumAdminForm, self).__init__(*arg, **kwargs)
        self.fields['time_point'] = forms.TimeField(widget=forms.TimeInput(format="%H:%M:%S.%f")) 

    class Meta:
        model = Maximum
        fields = ['item', 'time_point',]

class MaximumAdmin(admin.ModelAdmin):
    form = MaximumAdminForm

    def milliseconds(self, obj):
        return obj.time_point.strftime("%H:%M:%S.%f")[0:12]    

    milliseconds.short_description = 'time point'
    list_display = ('id', 'milliseconds',)

admin.site.register(Maximum, MaximumAdmin)
4

1 回答 1

4

Django 1.7 的下一个稳定版本目前支持 MySQL 5.0.3 及更高版本,并非所有这些版本都支持微秒。Django 1.8 目前是不稳定的主版本,其支持的版本和发布日期尚未确定。因此,后端在以下时间内截断微秒value_to_db_time

def value_to_db_time(self, value):
    if value is None:
        return None

    # MySQL doesn't support tz-aware times
    if timezone.is_aware(value):
        raise ValueError("MySQL backend does not support timezone-aware times.")

    # MySQL doesn't support microseconds
    return six.text_type(value.replace(microsecond=0))

这在受支持的数据库文档的 DateTime 字段部分下注明:

MySQL 不存储秒的分数。存储时间时,秒的小数部分被截断为零。

于 2014-06-12T12:32:36.193 回答