2015-08-20 7 views
6

In Django 1.8, lassen Sie uns sagen, dass wir dieses sehr einfaches Modell haben:Speichern von Modellinstanz mit Datetimefield in Django Admin verliert Auflösung Mikrosekunde

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

Wenn ich eine Modellinstanz meiner PostgreSQL-Datenbank zu speichern, die timestamp Feld habe Mikrosekunden. Ich habe festgestellt, dass beim Versuch, eine bestimmte Modellinstanz vom Django-Administrator zu bearbeiten, das Feld timestamp die Mikrosekundenauflösung verliert, wenn es in der Datenbank gespeichert wird.

Die meisten Anwendungen würden diese Genauigkeit nicht benötigen, aber für Anwendungen, die dies erfordern, wäre es schön, alle möglichen Ursachen für diesen Auflösungsverlust beseitigen zu können. Gibt es eine bekannte Möglichkeit, dies zu verhindern, oder ist das ein Fehler/eine Einschränkung?

+2

welche db verwenden Sie? – svfat

+0

@Alasdair - ja, das war ein Tippfehler von meinem Ende. Mein Schlechter und Danke! @svfat - PostgreSQL. Mir ist auch bewusst, dass MySQL keine Mikrosekunden-Auflösung unterstützt, aber die Tatsache ist, dass das Feld "Zeitstempel" die Mikrosekundenauflösung verliert, wenn Sie die Modellinstanz vom Django Admin aktualisieren. –

+1

Nebenbei unterstützen Django 1.8 und MySQL 5.6.4+ Mikrosekunden ([Release Notes] (https://docs.djangoproject.com/en/1.8/releases/1.8/#database-backends)) – Alasdair

Antwort

5

Das Problem ist, dass das Standard-Admin-Widget keine Mikrosekunden unterstützt. Sie können das Widget mit formfield_overrides überschreiben, um stattdessen DateTimeInput zu verwenden, und ein Format angeben, das Mikrosekunden enthält.

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) 

In Ihrem Fall, da es sich um ein Zeitstempel ist, ist eine weitere Option die hinzuzufügen, das Feld zu readonly_fields, hinzufügen, so dass es nicht geändert werden kann.

+0

Es wäre schön gewesen, das ursprüngliche Widget behalten zu können und gleichzeitig die Mikrosekundenauflösung beizubehalten. Was die "readonly_fields" anbelangt, können andere besondere Anwendungsfälle die Fähigkeit erfordern, bei Bedarf zu bearbeiten. Wie auch immer, danke für die Vorschläge! –

+0

Sie könnten versuchen, in den Code für das Widget für die Datumszeit des Administrators einzutauchen, aber ich weiß nicht, wie einfach die Anpassung auf Mikrosekunden wäre. – Alasdair

Verwandte Themen