type queryset query example python django django-models

python - queryset - Consulta de la base de datos Django: ¿cómo filtrar objetos por rango de fechas?



models py python (5)

Tengo un campo en una modelo como

class Sample(models.Model): date = fields.DateField(auto_now=False)

Ahora, necesito filtrar los objetos por un rango de datos, por ejemplo, todos los objetos que tienen fecha entre el 1 de enero de 2011 y el 31 de enero de 2011.

¡Gracias por tu ayuda!


Al hacer rangos de django con un filtro, asegúrese de conocer la diferencia entre usar un objeto de fecha frente a un objeto de fecha y hora. __range es inclusivo en las fechas pero si usa un objeto datetime para la fecha de finalización no incluirá las entradas para ese día si no se establece la hora.

startdate = date.today() enddate = startdate + timedelta(days=6) Sample.objects.filter(date__range=[startdate, enddate])

devuelve todas las entradas desde la fecha de inicio hasta la fecha final, incluidas las entradas en esas fechas. Mal ejemplo, ya que esto devuelve las entradas una semana en el futuro, pero obtienes la deriva.

startdate = datetime.today() enddate = startdate + timedelta(days=6) Sample.objects.filter(date__range=[startdate, enddate])

faltarán 24 horas de entradas según el tiempo de los campos de fecha.


Funciona para mi

YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())


Puede evitar la "falta de coincidencia de impedancia" causada por la falta de precisión en la comparación de objetos DateTimeField/date , que puede ocurrir si se usa el rango , utilizando datetime.timedelta para agregar un día a la última fecha en el rango. Esto funciona como:

start = date(2012, 12, 11) end = date(2012, 12, 18) new_end = end + datetime.timedelta(days=1) ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])

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 un DateTimeField , en lugar de jugar con objetos datetime desechables (y confusos). Ver más explicaciones en los comentarios a continuación.



Utilizar

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

O si solo está tratando de filtrar por mes:

Sample.objects.filter(date__year=''2011'', date__month=''01'')

Editar

Como dijo Bernhard Vallant, si desea que finalice un conjunto de preguntas que excluye el specified range ends , debe considerar su solución , que utiliza gt / lt (mayor que / menor que).