Django在管理员表单保存时丢失毫秒数

2 投票
1 回答
1107 浏览
提问于 2025-04-18 09:33

我正在使用mysql 5.7数据库和django 1.8,按照我的理解,这两个都支持毫秒。我可以通过mysql在我的数据库中输入时间,格式是HH:MM:SS.fff(例如:00:05:45:100)。

当我打开django的管理页面时,时间显示是正确的(例如:00:05:45:100000),但是如果我通过管理表单输入时间并点击“保存”,时间就变成了例如:00:05:45:000000,看起来毫秒没有被保存。

这是为什么呢?有没有办法解决这个问题?谢谢。

admin.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)

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))

这个问题在支持的数据库文档中的日期时间字段部分有说明:

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

撰写回答