2015-08-20 13 views
6

In Django 1.8, diciamo che abbiamo questo modello molto semplice:Risparmio esempio modello con DateTimeField in Django Admin perde risoluzione microsecondo

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

Dopo aver salvato un esempio modello per la mia database PostgreSQL, il campo timestamp sarà avere microsecondi. Ho notato che se provo a modificare una particolare istanza di modello dall'amministratore di Django, il campo timestamp perderà la risoluzione in microsecondi quando viene salvato nel database.

La maggior parte delle applicazioni non avrebbe bisogno di quel livello di accuratezza, ma per le applicazioni che lo richiedono, sarebbe bello poter eliminare tutte le possibili cause di questa perdita di risoluzione. C'è qualche modo/caratteristica conosciuta per prevenire questo o è un bug/limitazione?

+2

quale DB stai usando? – svfat

+0

@Alasdair - sì, quello era un errore dalla mia fine. il mio male e grazie! @svfat - PostgreSQL. Sono anche consapevole del fatto che MySQL non supporta la risoluzione in microsecondi, ma la questione del fatto qui è che il campo 'timestamp' perde la risoluzione di microsecondi quando si aggiorna l'istanza del modello da Django Admin. –

+1

Come parte a parte, Django 1.8 e MySQL 5.6.4+ supportano i microsecondi ([note sulla versione] (https://docs.djangoproject.com/en/1.8/releases/1.8/#database-backends)) – Alasdair

risposta

5

Il problema è che il widget di amministrazione predefinito non supporta i microsecondi. È possibile sovrascrivere il widget con formfield_overrides per utilizzare invece DateTimeInput e specificare un formato che includa i microsecondi.

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) 

Nel tuo caso, dal momento che è un timestamp, un'altra opzione è quella di aggiungere il aggiungere il campo per readonly_fields, in modo che non può essere cambiata affatto.

+0

Sarebbe stato bello poter mantenere il widget originale e allo stesso tempo preservare la risoluzione del microsecondo. Per quanto riguarda 'readonly_fields', altri casi d'uso particolari potrebbero comunque richiedere la possibilità di modificare quando necessario. Comunque, grazie per i suggerimenti! –

+0

Si potrebbe provare a scavare nel codice per il widget data ora dell'amministratore, ma non so quanto sarebbe facile personalizzare per includere i microsecondi. – Alasdair