with today now mexico datetimefield django timezone

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.

  1. Deshabilitar la gestión de zona horaria en settings.py

    USE_TZ = False

    Pero esto no siempre es deseable.

  2. 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)