2015-08-20 15 views
6

W Django 1.8, powiedzmy mamy to bardzo prosty model:Zapisywanie modelu wystąpienie z DateTimeField w Django Admin traci mikrosekund

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

Kiedy zapisać instancji modelu do mojej bazy danych PostgreSQL, pole timestamp będzie mają mikrosekundy. Zauważyłem, że jeśli spróbuję edytować konkretną instancję modelu od administratora Django, pole timestamp straci rozdzielczość mikrosekund po zapisaniu z powrotem w bazie danych.

Większość aplikacji nie wymaga takiego poziomu dokładności, ale w przypadku aplikacji, które tego wymagają, dobrze byłoby móc wyeliminować wszystkie możliwe przyczyny tej utraty rozdzielczości. Czy jest jakiś znany sposób/funkcja, aby temu zapobiec lub czy jest to błąd/ograniczenie?

+2

którego używacie db? – svfat

+0

@Alasdair - tak, to był literówka z mojego końca. moje złe i dzięki! @svfat - PostgreSQL. Jestem również świadomy, że MySQL nie obsługuje rozdzielczości mikrosekund, ale faktem jest, że pole 'timestamp' traci rozdzielczość mikrosekund po aktualizacji instancji modelu z Django Admin. –

+1

Na marginesie, Django 1.8 i MySQL 5.6.4 + obsługują mikrosekundy ([uwagi do wydania] (https://docs.djangoproject.com/en/1.8/releases/1.8/#database-backends)) – Alasdair

Odpowiedz

5

Problem polega na tym, że domyślny widget administratora nie obsługuje mikrosekund. Można zastąpić widżet przy użyciu formfield_overrides, aby zamiast niego użyć DateTimeInput i określić format obejmujący mikrosekundy.

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) 

W twoim przypadku, ponieważ jest to datownik, innym rozwiązaniem jest dodanie pola dodać do readonly_fields, tak że nie mogą być zmienione w ogóle.

+0

Byłoby miło móc zachować oryginalny widget i jednocześnie zachować rozdzielczość mikrosekundy. Jeśli chodzi o "readonly_fields", inne szczególne przypadki użycia mogą nadal wymagać możliwości edycji w razie potrzeby. W każdym razie, dzięki za sugestie! –

+0

Możesz spróbować wgryźć się w kod widżetu daty administratora, ale nie wiem, jak łatwo byłoby dostosować do włączenia mikrosekund. – Alasdair

Powiązane problemy