today - timezone django python
Cómo funciona la zona horaria de django con model.field''s auto_now_add (3)
El problema está en su extremo: datetime.now()
no es compatible con TZ, por lo que usted es el que alimenta una TZ ingenua. Consulte la documentación de Django sobre este tema . La razón por la que funciona cuando se configura default=datetime.now
es que está forzando el valor a un datetime ingenuo, por lo que cuando más tarde lo compara con otro datetime ingenuo, no hay problema.
Necesitas obtener "ahora" de la siguiente manera:
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
Supongo que la administración de la zona horaria se agregó a django 1.4, por lo que el problema es bastante nuevo.
Usé un modelo simple
class Sample(models.Model):
...
date_generated = models.DateTimeField(auto_now_add = True)
Cuando intento recuperar un registro recién creado, falla.
min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)
y el servidor emite una advertencia.
DateTimeField received a naive datetime (2012-06-29 15:02:15.074000) while time zone support is active.
Encontré dos soluciones a ese problema.
Deshabilitar la gestión de zona horaria en settings.py
USE_TZ = False
Pero esto no siempre es deseable.
cambiando
date_generated = models.DateTimeField(auto_now_add = True)
a
date_generated = models.DateTimeField(default=datetime.now())
Es la solución que mantiene funcionando la gestión de zonas horarias.
Tenga cuidado al establecer un valor predeterminado de DateTimeField
de datetime.now()
, ya que calculará un solo valor cuando Apache / nginx cargue Django (o cuando inicie el servidor de desarrollo), y todos los registros posteriores recibirán ese valor.
Siempre use auto_now_add
por esa razón.
Usa la zona horaria de django
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)