Estoy tratando de filtrar una DateTimeField
comparación con una fecha. Quiero decir:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Obtengo una lista de consulta vacía como respuesta porque (creo) que no estoy considerando el tiempo, pero quiero "en cualquier momento".
¿Hay una manera fácil en Django para hacer esto?
Tengo la hora en la fecha y hora establecida, no lo es 00:00
.
Respuestas:
Dichas búsquedas se implementan de la
django.views.generic.date_based
siguiente manera:Debido a que es bastante detallado, hay planes para mejorar la sintaxis utilizando el
__date
operador. Marque " # 9596 Comparar un DateTimeField con una fecha es demasiado difícil " para obtener más detalles.fuente
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// editar después de comentarios
no funciona porque crea un objeto datetime con valores de tiempo establecidos en 0, por lo que el tiempo en la base de datos no coincide
fuente
Estos son los resultados que obtuve con la función timeit de ipython:
contiene parece ser más rápido.
fuente
contains
solución, aparece el mensaje de error:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
filtro. Pero si se encuentra con problemas, debe probar el ejemplo de django docs que está utilizando__gte
.startswith
solución ..Ahora Django tiene un filtro de conjunto de consultas __date para consultar objetos datetime contra fechas en la versión de desarrollo. Por lo tanto, estará disponible en 1.9 pronto.
fuente
Lo anterior es lo que he usado. No solo funciona, sino que también tiene un respaldo lógico inherente.
fuente
A partir de Django 1.9, la forma de hacerlo es utilizando
__date
un objeto datetime.Por ejemplo:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
fuente
Esto produce los mismos resultados que usar __year, __month y __day y parece funcionar para mí:
fuente
suponiendo que active_on es un objeto de fecha, increméntelo en 1 día y luego haga un rango
fuente
Aquí hay una técnica interesante: aproveché el procedimiento de inicio con implementado con Django en MySQL para lograr el resultado de buscar solo una fecha y hora solo a través de la fecha. Básicamente, cuando Django realiza la búsqueda en la base de datos, tiene que hacer una conversión de cadena para el objeto de almacenamiento DATETIME MySQL, para que pueda filtrar eso, omitiendo la parte de fecha y hora de la fecha, de esa manera% LIKE% coincide solo con la fecha objeto y obtendrá cada marca de tiempo para la fecha dada.
Esto realizará la siguiente consulta:
El BINARIO ME GUSTA en este caso coincidirá con todo para la fecha, sin importar la marca de tiempo. Incluyendo valores como:
¡Espero que esto ayude a todos hasta que Django salga con una solución!
fuente
Hay una publicación de blog fantástica que cubre esto aquí: Comparación de fechas y horas en el ORM de Django
La mejor solución publicada para Django> 1.7, <1.9 es registrar una transformación:
Luego puede usarlo en sus filtros de esta manera:
EDITAR
Esta solución definitivamente depende del back end. Del artículo:
fuente
return '{}::date'.format(lhs), params
Hm .. Mi solución está funcionando:
fuente
fuente
En Django 1.7.6 funciona:
fuente
__lte
por ejemplo.Ver el artículo Documentación de Django
fuente