Django:DurationField,分辨率以微秒为单位

时间:2018-04-12 09:14:33

标签: django datetime django-admin

django DurationField在django管理界面中仅显示HH:MM:SS。

不幸的是,在目前的情况下,这还不够。

我需要能够在管理界面中显示/编辑微秒。

怎么可以这样做?

更新

这是一个错误。我在数据库中的数据是错误的。在数据进入数据库之前在进程中删除的微秒。

如果有的话,Django会显示微秒。你不需要做任何事情来展示它们。

1 个答案:

答案 0 :(得分:1)

了解来源:

https://docs.djangoproject.com/en/2.0/_modules/django/db/models/fields/#DurationField

我认为方法是覆盖forms.DurationFieldhttps://docs.djangoproject.com/en/2.0/_modules/django/forms/fields/#DurationField)并确切地说是这些方法:

from django.utils.duration import duration_string

def duration_string(duration):
    """Version of str(timedelta) which is not English specific."""
    days, hours, minutes, seconds, microseconds = _get_duration_components(duration)

    string = '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
    if days:
        string = '{} '.format(days) + string
    if microseconds:
        string += '.{:06d}'.format(microseconds)

    return string

请注意,可能还需要覆盖这些django.utils.dateparse.parse_duration

def parse_duration(value):
    """Parse a duration string and return a datetime.timedelta.

    The preferred format for durations in Django is '%d %H:%M:%S.%f'.

    Also supports ISO 8601 representation and PostgreSQL's day-time interval
    format.
    """
    match = standard_duration_re.match(value)
    if not match:
        match = iso8601_duration_re.match(value) or postgres_interval_re.match(value)
    if match:
        kw = match.groupdict()
        days = datetime.timedelta(float(kw.pop('days', 0) or 0))
        sign = -1 if kw.pop('sign', '+') == '-' else 1
        if kw.get('microseconds'):
            kw['microseconds'] = kw['microseconds'].ljust(6, '0')
        if kw.get('seconds') and kw.get('microseconds') and kw['seconds'].startswith('-'):
            kw['microseconds'] = '-' + kw['microseconds']
        kw = {k: float(v) for k, v in kw.items() if v is not None}
        return days + sign * datetime.timedelta(**kw)