Estoy usando django 1.4.1 con mysql y zonas horarias habilitadas. Hice datos de volcado en yaml, modifiqué algunos campos para crear algunos datos de prueba y trato de volver a cargarlos. Sin embargo, Django sigue quejándose de tiempos de datos ingenuos, aunque se especifica un tz
específicamente, mi loaddata tiene:
fields: {created_date: !!timestamp '2012-09-15 22:17:44+00:00', ...
pero loaddata da el error:
RuntimeWarning: DateTimeField received a naive datetime (2012-09-15 22:17:44) while time zone support is active.
Esto no tiene mucho sentido para mí, ya que es:
¿Hay alguna manera de que pueda decirle a Django que esta es una fecha UTC?
De los documentos …
Cuando se serializa una fecha y hora consciente, se incluye el desplazamiento UTC, como este:
"2011-09-01T13:20:30+03:00"
Para un datetime ingenuo, obviamente no es:
"2011-09-01T13:20:30"
… así que en lugar de …
created_date: !!timestamp '2012-09-15 22:17:44+00:00'
…cualquiera de…
created_date: '2012-09-15T22:17:44+00:00'
…o…
created_date: '2012-09-15T22:17:44Z'
…trabajará.
El problema proviene de PyYAML. Cuando loaddata retira el datetime a PyYAML, toma el datetime consciente, ajusta el tiempo a UTC y luego devuelve un datetime ingenuo, que genera la advertencia.
Hay un boleto de Django , así como un boleto de PyYAML con respecto al problema. Ambos entran en mucho mayor detalle con respecto al comportamiento inesperado anterior. A juzgar por los comentarios en los tickets, parece poco probable que este problema se resuelva en el corto plazo.
Si establece TIME_ZONE = 'UTC'
en settings.py de su proyecto, cargará la hora correcta, pero seguirá recibiendo avisos. En caso de que su zona horaria esté configurada como cualquier otra cosa, Django tratará la fecha y hora como local y la ajustará a UTC, lo que probablemente no sea deseado.
La mejor manera de evitar esto es usar JSON como formato de serialización.
Espero que ayude.
Puede copiar django / core / serializers / pyyaml.py al directorio de su proyecto y reemplazar el siguiente código (quizás 78-79 líneas en el caso de la versión 1.9.9)
for obj in PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options): yield obj
a
output = yaml.load(stream, Loader=SafeLoader) for a_model in output: for key, value in a_model.items(): if key == 'fields': for vkey, vvalue in value.items(): if isinstance(vvalue, datetime.datetime): value[vkey] = vvalue.replace(tzinfo=pytz.utc) for obj in PythonDeserializer(output, **options): yield obj
por supuesto Pytz ya instalado y
import pytz
es necesario
Este código convertirá todos los valores de fecha y hora ingenuos a UTC.
Para anular el serializador predeterminado, agregue SERIALIZATION_MODULES en settings.py:
SERIALIZATION_MODULES = {'yaml': 'yourproj.pyyaml'}
Espero que este parche de mono funcione bien.
Quería seguir usando YAML en lugar de los accesorios JSON para poder tener comentarios en los datos. La solución desde aquí solucionó el problema para mí: https://code.djangoproject.com/ticket/18867
Es decir, cambiando manualmente el accesorio YAML para que:
… y aparentemente eso desencadena la lógica de análisis de marca de tiempo de Django en lugar de la lógica PyYAML rota.