2012-09-17 10 views
5

Estoy usando django 1.4.1 con mysql y zonas horarias habilitadas. Hice un volcado de datos a yaml, modifiqué algunos campos para crear algunos datos de prueba, y estoy tratando de cargarlo de nuevo. Sin embargo, Django sigue quejándose de fechas inocentes aunque se especifica un tzLoaddata no trata con marcas de tiempo y zonas horarias correctamente

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

  1. una marca de tiempo UTC
  2. el mismo formato exacto Django exportado por medio dumpdata

¿hay alguna manera puedo decirle a Django esta es una fecha UTC?

Respuesta

8

Desde el docs ...

When serializing an aware datetime, the UTC offset is included, like this:

"2011-09-01T13:20:30+03:00" 

For a naive datetime, it obviously isn't:

"2011-09-01T13:20:30" 

... así que en vez 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' 

... funcionará.

19

El problema proviene de PyYAML. Cuando loaddata entrega la fecha y hora a PyYAML, toma la fecha de aviso, ajusta el tiempo a UTC, y luego devuelve un tiempo de fecha inocente, que genera la advertencia.

Hay un Django ticket, así como un PyYAML ticket relacionados con el problema. Ambos entran en mucho más detalle sobre el comportamiento inesperado anterior. A juzgar por los comentarios en las entradas, es poco probable que este problema se resuelva pronto.

Si configura TIME_ZONE = 'UTC' en settings.py de su proyecto, cargará en la hora correcta, pero seguirá recibiendo advertencias. Si su zona horaria se configura en cualquier otra cosa, Django tratará la hora de fecha 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.

1

Puede copiar django/core/serializers/pyyaml.py a su directorio de 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 

de pytz supuesto ya instalado y

import pytz 

que se necesita.

Este código convertirá todos los valores de fecha y hora inocentes en UTC aware.

Para sustituir serializador predeterminado, agregue SERIALIZATION_MODULES en settings.py:

SERIALIZATION_MODULES = {'yaml': 'yourproj.pyyaml'} 

espero que este parche mono funciona bien.

+0

He cargado el código completo en https://djangosnippets.org/snippets/10586/ –

Cuestiones relacionadas