Problemas al filtrar el campo de django datetime por mes y día

¿Puede alguien explicarme por qué los siguientes filtros no funcionan a nivel de mes y día? El filtrado por año parece funcionar, pero no los otros dos.

>>> clicks.count() 36 >>> date = clicks[0].created >>> date.month 2 >>> date.year 2014 >>> date.day 1 >>> clicks.filter(created__month=2) [] >>> clicks.filter(created__month=02) [] >>> clicks.filter(created__month='02') [] >>> clicks.filter(created__month='2') [] >>> clicks.filter(created__month=date.month) [] >>> clicks.filter(created__day=date.day) [] 

Una actualización rápida para demostrar que tengo el mismo comportamiento antes de crear y tratar con un queryset:

 >>> clicks = PreviewClick.objects.filter(created__month = 2) >>> clicks.count() 0 >>> clicks = PreviewClick.objects.filter(created__month = 02) >>> clicks.count() 0 >>> clicks = PreviewClick.objects.filter(created__month = '02') >>> clicks.count() 0 >>> clicks = PreviewClick.objects.filter(created__month = '2') >>> clicks.count() 0 

Aquí hay más alimento para el pensamiento:

 >>> clicks = PreviewClick.objects.all() >>> counter = 0 >>> for click in clicks: ... if click.created.month == 2: ... counter += 1 ... >>> counter 35 

Estaba viendo exactamente el mismo comportamiento que tú.

Si revisa la documentación para 1.6 y el mes queryset. Han añadido el siguiente párrafo:

“Cuando USE_TZ es Verdadero, los campos de fecha y hora se convierten a la zona horaria actual antes de filtrar. Esto requiere definiciones de zona horaria en la base de datos”.

Si cambia la siguiente línea en su configuración a Falso, entonces debe comenzar a recuperar los datos que está esperando.

 USE_TZ = False 

@Simon Wilder responde perfectamente por qué no funciona, aquí es cómo puede resolverlo sin deshabilitar el soporte de TZ en django

El documento Django da instrucciones para instalar la definición de zona horaria en la base de datos:

SQLite: instale pytz : las conversiones se realizan en Python.

PostgreSQL: sin requisitos (ver Zonas horarias).

Oracle: sin requisitos (consulte Cómo elegir un archivo de zona horaria).

MySQL: instale pytz y cargue las tablas de zona horaria con mysql_tzinfo_to_sql .

En mi caso: mysql y Mac Os, el siguiente comando resuelve el problema:

 sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql 

Tu syntax es incorrecta. Debería ser:

 Clicks.objects.filter(created__month=2) 

(dejaste fuera el administrador de ‘objetos’)

Para actualizar la respuesta aquí ya que me encontré con el problema anterior, pero ninguna de las soluciones funcionó. La mayoría de las nuevas instalaciones de mysql vienen preinstaladas con tz-info, por lo que el comando mysql_tzinfo_to_sql realmente no ayuda. Y establecer TZ_INFO en False no es realmente una solución, ya que muchos necesitan una fecha y hora con reconocimiento de zona horaria.

Entonces, lo que funcionó para mí fue crear un objeto de fecha y hora compatible con tz y verificarlo. Digamos que quieres filtrar los registros de hoy que harías algo como,

 from datetime import datetime import pytz today = datetime.now().replace(tzinfo=pytz.UTC).date() # tz aware datetime object todays_records = myModel.objects.filter(created__year=today.year, created__month=today.month,created__day=today.day) 

Espero que esto ayude.