2013-08-07 16 views
7

Czy można odtworzyć następujące zapytanie mysql w Django bez użycia metody select?Grupa Django według dat i wartości SUM

MariaDB [db1]> SELECT datetime, SUM(datas) FROM table AND datetime BETWEEN '2013-07-26 13:00:00' AND '2013-07-26 23:00:00' GROUP BY datetime; 

Aby uzyskać tego rodzaju Wynik:

+---------------------+-----------+ 
| datetime   | SUM(data) | 
+---------------------+-----------+ 
| 2013-07-26 13:00:00 |  489 | 
| 2013-07-26 14:00:00 |  2923 | 
| 2013-07-26 15:00:00 |  984 | 
| 2013-07-26 16:00:00 |  2795 | 
| 2013-07-26 17:00:00 |  1308 | 
| 2013-07-26 18:00:00 |  1365 | 
| 2013-07-26 19:00:00 |  1331 | 
| 2013-07-26 20:00:00 |  914 | 
| 2013-07-26 21:00:00 |  919 | 
| 2013-07-26 22:00:00 |  722 | 
| 2013-07-26 23:00:00 |  731 | 
+---------------------+-----------+ 
11 rows in set (1.45 sec) 

Edit: Mam na razie tego rodzaju zapytania:

>>> value = table.objects.filter(datetime__range=('2013-07-26 13:00:00', 
'2013-07-26 23:00:00')).values('datetime', 'data').annotate(Sum('data')) 

>>> print value.query 
SELECT `table`.`datetime`, `table`.`data` SUM(`table`.`imps`) AS `data__sum` 
FROM `table` 
WHERE `table`.`datetime` BETWEEN 2013-07-26 13:00:00 
and 2013-07-26 23:00:00 GROUP BY `table`.`datetime`, 
`table`.`data` ORDER BY NULL 

Dlaczego suma działać zarówno na datetime i danych?

Próbowałem wszędzie na dokumencie Django, tutaj na stosie, ale nie znalazłem czegoś spójnego z moim problemem. Wszelkie sugestie?

+1

Co robi twój SQL queryset wygenerować? Możesz użyć 'print values.query' –

+0

Zmienić kolejność' .annotate() 'i' .values ​​() ' –

Odpowiedz

6

Hmm używasz Count, należy użyć Sum i values() zadecyduje, co dzieje się GROUP BY więc należy użyć values('datetime') tylko. Twój queryset powinno być coś takiego:

from django.db.models import Sum 

values = self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1]) 
).values('datetime').annotate(data_sum=Sum('data')) 

choć nie jestem pewien co do rzędu filter(), więc to może być to:

values = self.model.objects.values('datetime').annotate(data_sum=Sum('data')).filter(
    datetime__range=(self.dates[0], self.dates[1]) 
) 

Chyba że chcesz spróbować zarówno wtedy . Jeśli chcesz zobaczyć surowego kwerendy tych queryset użyć Queryset.query:

print self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1]) 
).values('datetime').annotate(data_sum=Sum('data')).query.__str__() 

więc można mieć pewność, że masz prawo zapytania.

Mam nadzieję, że to pomaga.

+1

thx, po co filtrować adnotacje? – tbenett

+1

Po prostu nie jestem pewien co do wynikowego zapytania z nich, więc może to być albo i użyj 'query .__ str_ _()', aby sprawdzić zapytanie, którego potrzebujesz. Sprawdź również uważnie moją odpowiedź, powinieneś użyć 'values ​​('datetime')' only –

+0

Czy możesz edytować odpowiedź, aby wskazać, która odpowiedź była poprawna? – Jglstewart

4

order_by() będzie Ci GROUP BY:

values = self.model.objects.filter(datetime__range=(
    self.dates[0], self.dates[1])) \ 
    .values('datetime') \ 
    .annotate(data_sum=Sum('datas') \ 
    .order_by()) 
+0

Nie działa, przepraszam: SELECT 'table''datetime',' table'.'data' Z 'table' WHERE' table''datetime' MIĘDZY 2013-07-26 13:00:00 i 2013-07 -26 23:00:00) ORDER BY 'table''datetime' ASC – tbenett

+0

Co powiesz teraz? –

+0

W porządku, używam metody Hieu Nguyena, a problem pochodzi z wartości ("datetime", "data"). – tbenett