【问题标题】:Saving model instance with DateTimeField in Django Admin loses microsecond resolution在 Django Admin 中使用 DateTimeField 保存模型实例会丢失微秒分辨率
【发布时间】: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)

标签: python django django-models django-admin django-orm


【解决方案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,其他特殊用例可能仍需要在需要时进行编辑。无论如何,感谢您的建议!
  • 您可以尝试深入研究管理员的日期时间小部件的代码,但我不知道自定义包含微秒有多容易。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2012-11-12
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多