2012-11-05 14 views
12

Questo problema si è verificato a intermittenza per alcune settimane e non è diverso da nessuno che ha ideato il mio progetto.Django default = timezone.now() salva i record utilizzando l'ora "vecchia"

Due dei modelli utilizzati hanno un campo data/ora, che per impostazione predefinita è impostato su timezone.now().

Questa è la sequenza che solleva le bandiere di errore: una


  • modello è stato creato al momento 07:30

  • Modello due si crea al momento 10:00, ma nel database MySQL è archiviato come 7:30 PM!

Ogni modello che viene creato ha il suo timbro di tempo risparmiato in 19:30, non il tempo effettivo, fino a un certo durata passa. Poi un nuovo tempo viene impostato e tutti i seguenti modelli avere quel tempo nuovo ... Bizzare


alcuni dettagli in più che possono aiutare a scoprire il problema:

Ho un sacco di metodi che ho utilizzare per spogliare i miei fusi orari dei loro tzinfo e sostituirli con UTC.

Questo perché sto facendo un calcolo timezone.now() - creationTime per creare un: "modello è stato pubblicato questo molto tempo fa" funzione nel progetto. Tuttavia, questo in realtà non dovrebbe essere la causa del problema.

Non penso che usare datetime.datetime.now() farà alcuna differenza.

In ogni caso, grazie per l'aiuto!

+1

Scommetto che il problema "è corretto" per il primo record * dopo * il processo del server viene riavviato (e forse solo/tutti i nuovi record inseriti nello stesso minuto del riavvio del server). Si prega di mostrare il codice che utilizza/imposta/stabilisce questo valore predefinito. Sospetto che venga valutato solo * una volta * (quando viene creato il primo record) e non aggiornato per i record successivi. –

+0

La tua previsione è corretta! Cosa ti fa pensare questo e perché dovrebbe succedere? –

risposta

44

Ho appena incontrato la scorsa settimana per un campo che aveva default=date.today(). Se si rimuovono le parentesi (in questo caso, prova default=timezone.now), si passa un callable al modello e questo verrà chiamato ogni volta che viene salvata una nuova istanza. Con le parentesi, viene chiamato una sola volta quando vengono caricati i carichi models.py.

+1

Questo è molto bello, grazie per la risposta. La funzione pass è piuttosto fuorviante perché da quando ho iniziato con django come amateaur, ogni singola guida che ho letto e tutti i libri hanno avuto datetime.datetime.now() o timezone.now() impostato come predefinito per timestamp, è appena diventato qualcosa che ho fatto automaticamente per tutti i miei timestamp! –

+0

Suppongo che farlo male in questo modo sembrerebbe funzionare se hai distribuito le tue app Django con CGI vecchio stile; e ovviamente devi testare per un periodo di ore o giorni per notare che questi timestamp non si aggiornano ... Ma se questo è un consiglio diffuso, non mi dà fiducia nei test di quegli autori. : -/ –

+3

Non sono sicuro di quali esempi suggerirebbero di chiamare 'datetime.now()'. Quando la funzione sul campo riceve quell'argomento, è solo un oggetto datetime. –

7

Basta impostare il parametro auto_now_add in questo modo.

timestamp = models.DateTimeField(auto_now_add=True) 

Aggiornamento:

Si prega di non utilizzare auto_now_add. Invece di fare questo:

from django.utils import timezone 

timestamp = models.DateTimeField(default=timezone.now) 
+1

Questo non è più il metodo preferito per realizzare questo. [Deprecated] (https://code.djangoproject.com/ticket/22995) – davelupt

Problemi correlati