Przypuszczam, że zarządzanie strefą czasową zostało dodane do django 1.4, więc problem jest całkiem nowy.Jak działa strefa czasowa django z auto_now_add model.field
użyłem prostego modelu
class Sample(models.Model):
...
date_generated = models.DateTimeField(auto_now_add = True)
Kiedy próbuję pobrać nowo utworzonego rekordu jej się nie powiedzie.
min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)
i serwer wydaje ostrzeżenie.
DateTimeField received a naive datetime (2012-06-29 15:02:15.074000) while time zone support is active.
Wymyśliłem dwa rozwiązania tego problemu.
Wyłącz zarządzanie strefa czasowa w settings.py
USE_TZ = False
ale nie zawsze jest to desierable.
zmieniając
date_generated = models.DateTimeField(auto_now_add = True)
do
date_generated = models.DateTimeField(default=datetime.now())
jest rozwiązanie, które utrzymuje zarządzania strefą czasową pracę
Czy to znaczy, że nie można po prostu użyć auto_now lub auto_now_add jeśli mam USE_TZ = true? – dannyroa
Wygląda na to, że 'auto_now' i' auto_now_add' z natury używają 'datetime.now'. Wydaje się dziwnym zaniedbaniem dla Django wstawiania urządzeń obsługujących TZ do Django, ale tęsknię za tym bardzo ważnym, ale los tych dwóch kwargów był długo dyskutowany. Moje rozumowanie polega na tym, że są one pozostawione dla kompatybilności wstecznej (i aby uniknąć odpychania), ale nie oczekuj, że dostaną jakąkolwiek miłość. Po prostu ustaw 'default' kwarg na' utcnow' i nie przejmuj się 'auto_now' lub' auto_now_add', jeśli chcesz mieć TZ w pamięci. –
Dzięki Chris. Nie sądzę, aby "default" działał w zastępstwie "auto_now", ponieważ ten ostatni zawsze aktualizuje czas dla każdego zapisu, podczas gdy "default" jest tylko wtedy, gdy pole nie ma wartości. – dannyroa