¿Cómo solicito los objetos creados antes de cierta hora en un día en Django?

En Django, estoy tratando de filtrar mi consulta solo a los objetos que se crearon antes de cierta hora del día. Tengo un campo de fecha y hora llamado ‘created_at’ que almacenó la fecha y hora a partir de la cual se creó ese objeto.

Lo que me gustaría hacer es:

query = query.filter(created_at__hour__lte=10) 

Que esperaría obtener todos los objetos que fueron creados antes de las 10am. Sin embargo, cuando bash eso me sale un:

 FieldError: Join on field 'created_at' not permitted. Did you misspell 'hour' for the lookup type? 

Podría recorrer cada día y obtener los objetos de ese día, pero eso parece altamente ineficiente. ¿Hay alguna manera de hacer esto en una sola consulta? Si no, ¿cuál es la forma más rápida de ejecutar este tipo de filtro?

__hour on a DateTimeField es un tipo de búsqueda, por lo que no puede mezclarlo con otro tipo de búsqueda como __lte . Podrías construir un filtro con objetos Q , por ejemplo:

 before_ten = Q(created_at__hour=0) for hour in range(1, 11): before_ten = before_ten | Q(created_at__hour=hour) query = query.filter(before_ten) 

Si puede cambiar su modelo de datos, podría ser más conveniente guardar un TimeField tiempo de creación, así como su created_at existente.

 import datetime start_time = datetime.datetime.now().replace(hour=00, minute=00) certain_hour = 10 end_time = start_time.replace(hour=certain_hour) query = query.filter(created_at__range=(start_time, end_time) 

En Django 1.9+, puedes encadenar búsquedas de hora como created_at__hour__lte , por lo que la consulta de la pregunta funcionará.

 query = query.filter(created_at__hour__lte=10)