Tengo un campo en un modelo como:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Ahora, necesito filtrar los objetos por un rango de fechas.
¿Cómo filtro todos los objetos que tienen una fecha entre 1-Jan-2011
y 31-Jan-2011
?
python
django
django-models
django-queryset
usuario469652
fuente
fuente
__range
incluye los bordes (como sql'sBETWEEN
), si no desea que se incluyan los bordes, debería ir con mi solución gt / lt ...order_by
más de lo generadoQuerySet
por lo mencionado anteriormentefilter
. No he usado Django en años.Puedes usar django's
filter
condatetime.date
objetos :fuente
Al hacer rangos de django con un filtro, asegúrese de saber la diferencia entre usar un objeto de fecha frente a un objeto de fecha y hora. __range incluye fechas, pero si utiliza un objeto datetime para la fecha de finalización, no incluirá las entradas para ese día si no se establece la hora.
devuelve todas las entradas desde la fecha de inicio hasta la fecha de finalización, incluidas las entradas en esas fechas. Mal ejemplo, ya que esto está devolviendo entradas una semana en el futuro, pero obtienes la deriva.
faltarán 24 horas de entradas dependiendo de la hora para los campos de fecha configurados.
fuente
date
objeto:>>> from datetime import date
>>> startdate = date.today()
Puede evitar la "falta de coincidencia de impedancia" causada por la falta de precisión en la
DateTimeField/date
comparación de objetos, que puede ocurrir si se usa el rango , usando datetime.timedelta para agregar un día a la última fecha en el rango. Esto funciona como:Como se discutió anteriormente, sin hacer algo como esto, los registros se ignoran el último día.
Editado para evitar el uso de
datetime.combine
- parece más lógico seguir con las instancias de fecha cuando se compara con aDateTimeField
, en lugar de meterse condatetime
objetos desechables (y confusos) . Ver más explicaciones en los comentarios a continuación.fuente
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
lo tanto , no incluiría los objetos creadosdate(2014, 2, 1)
, como @cademan explicó útilmente. Pero si incrementa la fecha de finalización agregando un día, obtendría un conjunto de consultas que cubra esos objetos faltantes (y convenientemente omita los objetos creadosdate(2014, 2, 2)
debido a la misma peculiaridad). Lo molesto aquí es que un rango 'manual' especificado concreated__gte ... created__lte=date(2014, 2, 1)
tampoco funciona, lo que definitivamente es contradictorio en mi humilde opinión.Es simple,
Funciona para mi
fuente
Para hacerlo más flexible, puede diseñar un FilterBackend de la siguiente manera:
fuente
Sigue siendo relevante hoy. También puedes hacer:
fuente