2013-08-07 39 views
7

Có thể sao chép truy vấn mysql sau đây trong Django mà không sử dụng phương pháp chọn không?Nhóm Django theo ngày và giá trị 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; 

Để có được loại này kết quả:

+---------------------+-----------+ 
| 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) 

Chỉnh sửa: Tôi đã nhận cho bây giờ loại truy vấn:

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

Tại sao tổng hoạt động trên cả hai datetime và dữ liệu?

Tôi đã cố gắng để ở khắp mọi nơi trên django doc, ở đây trên ngăn xếp nhưng không tìm thấy cái gì gắn liền với vấn đề của tôi. Bất kỳ đề xuất nào?

+1

SQL gì queryset của bạn tạo ra? Bạn có thể sử dụng 'print values.query' –

+0

Chuyển đổi thứ tự' .annotate() 'và' .values ​​() ' –

Trả lời

6

Hmm bạn đang sử dụng Count, bạn nên sử dụng Sum, và values() sẽ xác định những gì diễn ra vào GROUP BY vì vậy bạn nên sử dụng values('datetime') chỉ. queryset của bạn nên được một cái gì đó như thế này:

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')) 

mặc dù tôi không chắc về thứ tự của các filter(), vì vậy nó có thể là thế này:

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

Tôi đoán bạn sẽ muốn thử cả hai sau đó . Nếu bạn muốn xem truy vấn thô của các truy vấn đó, hãy sử dụng Queryset.query:

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

Vì vậy, bạn có thể đảm bảo bạn có được truy vấn đúng.

Hy vọng điều đó sẽ hữu ích.

+1

thx, tại sao lọc sau chú thích? – tbenett

+1

Nó chỉ là tôi không chắc chắn về kết quả truy vấn của họ để nó có thể là một trong hai, anyway sử dụng 'truy vấn .__ str __()' để kiểm tra các truy vấn bạn cần. Ngoài ra kiểm tra câu trả lời của tôi một cách cẩn thận, bạn nên sử dụng 'giá trị ('datetime')' chỉ –

+0

Bạn có thể chỉnh sửa câu trả lời để cho biết câu trả lời nào đúng không? – Jglstewart

4

order_by() sẽ giúp bạn có 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

Không hoạt động, xin lỗi: SELECT 'table'.'datetime',' table'.'data' FROM 'table' WHERE' table'.'datetime' BETWEEN 2013-07-26 13:00:00 và 2013-07 -26 23:00:00) ĐẶT HÀNG THEO 'table'.'datetime' ASC – tbenett

+0

Còn bây giờ thì sao? –

+0

Không sao đâu, tôi sử dụng phương pháp Hiếu Nguyễn và vấn đề xuất phát từ các giá trị ('datetime', 'data') – tbenett

Các vấn đề liên quan