Los datos de carga no se ocupan de las marcas de hora y zonas horarias correctamente

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:

  1. una marca de tiempo UTC
  2. El mismo formato exacto que Django exportó usando dumpdata

¿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:

  • No usa la etiqueta YAML!
  • Incluye los valores de marca de tiempo entre comillas
  • Incluye información de zona horaria en el valor de marca de tiempo

… y aparentemente eso desencadena la lógica de análisis de marca de tiempo de Django en lugar de la lógica PyYAML rota.