2012-11-05 13 views
12

Bu sorun, birkaç hafta boyunca açık ve kapalı oluyor ve projemde ortaya çıkanlardan farklı.Django default = timezone.now(), kayıtları "eski" saatini kullanarak kaydeder

Kullanılan modellerin ikisi varsayılan olarak timezone.now() olarak ayarlanmış bir zaman damgası alanına sahiptir.

Bu

hata bayrakları yükseltir dizisidir:


  • Modeli biri 19:30

  • Modeli iki zaman 10:00 PM oluşturulur anda yaratılmış, ancak MySQL veritabanında 7:30 PM olarak saklanır!

belli süresi geçene kadar , 7:30 gerçek zaman değil altına kaydedilir onun zaman damgası vardır Oluşturulan her modeli. Sonra ... bizzar


sorunu ortaya çıkarılmasında yardımcı olabilecek bazı ek ayrıntılar yeni bir zaman ayarlanır ve takip eden tüm modeller yeni zaman buna sahip:

Ben yöntemlerin bir grup var ben tzinfo'ların saat dilimlerimi kesmek ve bunları UTC ile değiştirmek için kullanın.

Bunun nedeni, bir "oluşturmak için model: timezone.now() - creationTime hesaplama yapıyorum: bu model uzun bir süre önce yayınlandı" özelliği projede. Ancak, bu gerçekten sorunun sebebi olmamalı.

datetime.datetime.now() kullanımının herhangi bir fark yaratacağını düşünmüyorum.

Neyse, yardımlarınız için teşekkürler!

+1

Sorunu ilk kayıt için "sabittir" bahis * sonra * sunucu işlemi yeniden başlar (ve belki de yalnızca/tüm yeni kayıtların aynı dakika takılı sunucu yeniden başlat). Lütfen bu varsayılan değeri kullanan/ayarlar/kurar. Sadece bir kere * (ilk kayıt oluşturulduğunda) değerlendirilir ve sonraki kayıtlar için güncellenmez. –

+0

Tahmininiz doğru! Bunu ne düşündüğünü ve neden oluyor? –

cevap

44

Sadece geçen hafta default=date.today() olan bir alan için koştum. Parantezleri kaldırırsanız (bu durumda, default=timezone.now'u deneyin), modele bir satır geçirebilirsiniz ve her yeni bir örnek kaydedildiğinde çağrılır. Parantez ile sadece models.py yüklendiğinde bir kez çağrılır.

+1

Bu çok güzel, yanıt için teşekkürler. Fonksiyon geçişi oldukça yanıltıcıdır çünkü bir amateaur olarak django ile başladığımdan beri okuduğum her rehber ve kitapların hepsi detetime.datetime sahiptir.şimdi() veya timezone.now() zaman damgaları için varsayılan olarak ayarlanmış, sadece tüm zaman damgalarım için otomatik olarak yaptığım bir şey haline geldi! –

+0

Yanlış yaptığımı varsayalım, Django uygulamalarınızı sadece eski moda CGI ile dağıttığınız takdirde bu şekilde işe yarayacak gibi görünecektir; ve tabii ki bu zaman damgalarının güncellenmediğini fark etmek için saatlerce veya günlerde test etmeniz gerekir ... Fakat bu yaygın bir tavsiye ise, bu yazarların testlerine güvenmeme neden olmaz. : -/ –

+3

Hangi örneklerin "datetime.now()" çağrısını önerdiğinden emin değilim. Alan işlevi bu argümanı aldığında, sadece bir tarih-zamanı nesnesidir. –

7

auto_now_add parametresini bu şekilde ayarlayın.

timestamp = models.DateTimeField(auto_now_add=True) 

Güncelleme:

auto_now_add lütfen kullanmayın. Bu önerilen yol değildir, bunun yerine bunu:

from django.utils import timezone 

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

Bu, artık bunu gerçekleştirmek için tercih edilen bir yöntem değildir. [Kaldırıldı,] (https://code.djangoproject.com/ticket/22995) – davelupt

İlgili konular