update select_related queryset query not example python django datetime filter django-queryset

python - queryset - select_related django example



¿Cómo puedo filtrar una fecha de DateTimeField en Django? (14)

A partir de Django 1.9, la forma de hacerlo es mediante el uso de docs.djangoproject.com/en/1.9/ref/models/querysets/#date en un objeto datetime.

Por ejemplo: MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))

Estoy tratando de filtrar un DateTimeField comparando con una fecha. Quiero decir:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

Obtengo una lista de consultas vacías como respuesta porque (creo) no estoy considerando el tiempo, pero quiero "en cualquier momento".

¿Hay alguna manera fácil en Django para hacer esto?

Tengo el tiempo en el horario programado, no es 00:00 .


Ahora Django tiene el filtro __date queryset para consultar los objetos de fecha y hora contra las fechas en la versión de desarrollo. Por lo tanto, estará disponible en 1.9 pronto.


Aquí hay una técnica interesante: utilicé el procedimiento de inicio tal como se implementó con Django en MySQL para lograr el resultado de solo buscar una fecha a través de solo 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 marca de tiempo de la fecha-- de esa manera% LIKE% solo coincide con la fecha objeto y obtendrás cada marca de tiempo para la fecha dada.

datetime_filter = datetime(2009, 8, 22) MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())

Esto realizará la siguiente consulta:

SELECT (values) FROM myapp_my_object / WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%

El LIKE BINARY en este caso coincidirá con todo para la fecha, sin importar la fecha y hora. Incluyendo valores como:

+---------------------+ | datetime_attr | +---------------------+ | 2009-08-22 11:05:08 | +---------------------+

¡Espero que esto ayude a todos hasta que Django salga con una solución!


Dichas búsquedas se implementan en django.views.generic.date_based siguiente manera:

{''date_time_field__range'': (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))}

Debido a que es bastante detallado, hay planes para mejorar la sintaxis mediante el operador __date . Verifique " # 9596 Comparando un DateTimeField a una fecha es demasiado difícil " para más detalles.


En Django 1.7.6 funciona:

MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))


Esto produce los mismos resultados que al usar __year, __month y __day y parece funcionar para mí:

YourModel.objects.filter(your_datetime_field__startswith=datetime.date(2009,8,22))


Estos son los resultados que obtuve con la función timeit de ipython:

from datetime import date today = date.today() timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)] 1000 loops, best of 3: 652 us per loop timeit[Model.objects.filter(date_created__gte=today)] 1000 loops, best of 3: 631 us per loop timeit[Model.objects.filter(date_created__startswith=today)] 1000 loops, best of 3: 541 us per loop timeit[Model.objects.filter(date_created__contains=today)] 1000 loops, best of 3: 536 us per loop

contiene parece ser más rápido.


Hay una publicación fantástica que cubre esto aquí: Comparación de fechas y fechas en Django ORM

La mejor solución publicada para Django> 1.7, <1.9 es registrar una transformación:

from django.db import models class MySQLDatetimeDate(models.Transform): """ This implements a custom SQL lookup when using `__date` with datetimes. To enable filtering on datetimes that fall on a given date, import this transform and register it with the DateTimeField. """ lookup_name = ''date'' def as_sql(self, compiler, connection): lhs, params = compiler.compile(self.lhs) return ''DATE({})''.format(lhs), params @property def output_field(self): return models.DateField()

Entonces puedes usarlo en tus filtros así:

Foo.objects.filter(created_on__date=date)

EDITAR

Esta solución definitivamente depende de la parte de atrás. Del artículo:

Por supuesto, esta implementación se basa en su sabor particular de SQL que tiene una función DATE (). MySQL lo hace. Lo mismo ocurre con SQLite. Por otro lado, no he trabajado personalmente con PostgreSQL, pero algunos me llevan a creer que no tiene una función DATE (). Así que una implementación así de simple parece que necesariamente será algo dependiente de back-end.


Hm .. Mi solución está funcionando:

Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))


Ver el artículo Documentación de Django

Es muy similar a la respuesta JZ

ur_data_model.objects.filter(ur_date_field=datetime(2005, 7, 27)


asumiendo que active_on es un objeto de fecha, increméntelo por 1 día y luego haga el rango

next_day = active_on + datetime.timedelta(1) queryset = queryset.filter(date_created__range=(active_on, next_day) )


Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)


Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))

lo de arriba es lo que he usado. No solo funciona, también tiene un respaldo lógico inherente.


YourModel.objects.filter(datetime_published__year=''2008'', datetime_published__month=''03'', datetime_published__day=''27'')

// editar después de comentarios

YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))

doest 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.