在 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 保存模型实例会丢失微秒分辨率的主要内容,如果未能解决你的问题,请参考以下文章