在 Django Admin 中使用 DateTimeField 保存模型实例会丢失微秒分辨率

Posted

技术标签:

【中文标题】在 Django Admin 中使用 DateTimeField 保存模型实例会丢失微秒分辨率【英文标题】:Saving model instance with DateTimeField in Django Admin loses microsecond resolution 【发布时间】:2015-11-13 19:09:44 【问题描述】:

在 Django 1.8 中,假设我们有这个非常简单的模型:

class Log(models.Model):
    remarks = models.TextField()
    timestamp = models.DateTimeField(default=timezone.now)

当我将模型实例保存到我的 PostgreSQL 数据库时,timestamp 字段将有微秒。我注意到,如果我尝试从 Django 管理员编辑特定模型实例,timestamp 字段在保存回数据库时将丢失微秒分辨率。

大多数应用程序不需要这种级别的精度,但对于确实需要这种精度的应用程序,能够消除这种分辨率损失的所有可能原因会很好。是否有任何已知的方法/功能可以防止这种情况发生,或者这是一个错误/限制?

【问题讨论】:

您使用的是哪个数据库? @Alasdair - 是的,这是我的错字。我的不好,谢谢! @svfat - PostgreSQL。我也知道 mysql 不支持微秒分辨率,但事实上,当您从 Django Admin 更新模型实例时,timestamp 字段会丢失微秒分辨率。 顺便说一句,Django 1.8 和 MySQL 5.6.4+ 确实支持微秒 (release notes) 【参考方案1】:

问题是默认管理小部件不支持微秒。您可以使用formfield_overrides 覆盖小部件以改用DateTimeInput,并指定包含微秒的格式。

from django.contrib import admin
from django.db import models
from django import forms

from .models import Log

class LogAdmin(admin.ModelAdmin):

    formfield_overrides = 
        models.DateTimeField: 'widget': forms.DateTimeInput(format='%Y-%m-%d %H:%M:%S.%f'),
    

admin.site.register(Log, LogAdmin)

在您的情况下,由于它是一个时间戳,另一种选择是将添加字段添加到readonly_fields,这样它就根本无法更改。

【讨论】:

如果能够保留原始小部件并同时保留微秒分辨率,那就太好了。至于readonly_fields,其他特殊用例可能仍需要在需要时进行编辑。无论如何,感谢您的建议! 您可以尝试深入研究管理员的日期时间小部件的代码,但我不知道自定义包含微秒有多容易。

以上是关于在 Django Admin 中使用 DateTimeField 保存模型实例会丢失微秒分辨率的主要内容,如果未能解决你的问题,请参考以下文章

django-select2 不能在 django-admin 中使用内联

在 django-admin 中更新记录的问题

Django使用admin管理后台

django-admin小试

Django Admin后台管理模块的使用

Django:在 django admin 中扩展 base.html