2011-12-21 23 views
8

Estoy intentando filtrar usuarios por fecha, pero no puedo hasta que pueda encontrar la primera y la última fecha de los usuarios en la base de datos. Si bien puedo hacer que mi secuencia de comandos filtre los dups más tarde, quiero hacerlo desde el principio usando distinct de Django, ya que reduce significativamente. ProbéDjango: obtenga fechas distintas de la marca de tiempo

User.objects.values('install_time').distinct().order_by() 

pero desde install_time es una timestamp, que incluye la fecha y la hora (que realmente no importa). Como resultado, los únicos que filtra son las fechas en las que podríamos recuperar las fechas de instalación de los usuarios múltiples pero no los tiempos.

¿Alguna idea de cómo hacer esto? Estoy ejecutando esto usando Django 1.3.1, Postgres 9.0.5 y la última versión de psycopg2.

EDIT: me olvidó añadir el tipo de datos de install_time:

install_time = models.DateTimeField() 

EDIT 2: Aquí hay un ejemplo de salida de la cáscara de Postgres, junto con una breve explicación de lo que quiero:

2011-09-19 00:00:00 
2011-09-11 00:00:00 
2011-09-11 00:00:00 <--filtered out by distinct() (same date and time) 
2011-10-13 06:38:37.576 
2011-10-13 00:00:00 <--NOT filtered out by distinct() (same date but different time) 

soy consciente de Manager.raw, sino que más bien django.db.connection.cursor usuario para escribir la consulta directamente desde Manager.raw devuelve un RawQuerySet que, IMO, es peor que simplemente escribir la consulta SQL de forma manual e iterar.

+1

duplicado Posible de http://stackoverflow.com/questions/3388559/django-model-group-by-datetimes-date – thatwasbrilliant

+0

@thatwasbrilliant Eso era exactamente lo que yo estaba buscando; ¡Gracias! Es extraño que solo tomó 30 minutos en SO cuando tomó 2 horas en Google sin resultado. – Edwin

+1

Necesita trabajar en sus habilidades de Google :) – thatwasbrilliant

Respuesta

7

Al hacer informes sobre grandes conjuntos de datos itertools.group_by podría ser demasiado lento. En aquellos casos en que tomo postgres manejan la agrupación:

truncate_date = connection.ops.date_trunc_sql('day','timestamp') 
qs = qs.extra({'date':truncate_date}) 
return qs.values('date').annotate(Sum('amount')).order_by('date') 
+0

Gracias por el snippet @ till-backhaus; Necesitaba esto para otro proyecto. –

+0

Esta es la versión que trato de mantener actualizada: http://stackoverflow.com/a/8746532/246241 – tback

0

He votado para cerrar esto ya que es un dup de this question, así que aquí está la respuesta si no desea visitar el enlace, cortesía de nosklo.


crear una pequeña función para extraer sólo la fecha: def extract_date (entidad): 'extrae la fecha de inicio de una entidad' entity.start_time.date retorno()

A continuación, puede utilizarlo con itertools.groupby:

from itertools import groupby 

entities = Entity.objects.order_by('start_time') 
for start_date, group in groupby(entities, key=extract_date): 
    do_something_with(start_date, list(group)) 
+0

Todavía es útil tener su pregunta en todo, ya que no pudo encontrar la respuesta con 30 minutos buscando en Google. Debes aceptar esta respuesta y dejarla así :) La próxima vez que alguien use tu idioma para buscar este problema, esta Q aparecerá en google. –

+0

@YujiTomita Es por eso que estoy cerrando, no borrando. Todavía tengo respuestas cerradas que aparecen en Google. – Edwin

Cuestiones relacionadas