2013-07-27 27 views
6

Tôi đang tìm phương pháp nhanh để đếm các đối tượng của mô hình được tạo trong vòng 30 ngày qua, mỗi ngày riêng biệt. Ví dụ:Nhận các đối tượng được tạo trong 30 ngày qua, cho mỗi ngày qua

27.07.2013 (today) - 3 objects created 
26.07.2013 - 0 objects created 
25.07.2013 - 2 objects created 
... 
27.06.2013 - 1 objects created 

Tôi sẽ sử dụng dữ liệu này trong API biểu đồ google. Bạn có bất kỳ ý tưởng làm thế nào để có được dữ liệu này hiệu quả?

Trả lời

17
items = Foo.objects.filter(createdate__lte=datetime.datetime.today(), createdate__gt=datetime.datetime.today()-datetime.timedelta(days=30)).\ 
    values('createdate').annotate(count=Count('id')) 

này sẽ (1) kết quả lọc để chứa 30 ngày qua, (2) chỉ chọn lĩnh vực và Tạo (3) tính của id, nhóm bởi tất cả các lĩnh vực được lựa chọn (ví dụ: Tạo ngày). Điều này sẽ trả về một danh sách các từ điển của các định dạng:

[ 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    ... 
] 

EDIT:

Tôi không tin rằng có một cách để có được tất cả các ngày, thậm chí những người có count == 0, chỉ với SQL. Bạn sẽ phải chèn từng ngày bị thiếu thông qua mã python, ví dụ:

import datetime 

# needed to use .append() later on 
items = list(items) 

dates = [x.get('createdate') for x in items] 

for d in (datetime.datetime.today() - datetime.timedelta(days=x) for x in range(0,30)): 
    if d not in dates: 
     items.append({'createdate': d, 'count': 0}) 
+0

Điều gì đó tôi đang tìm kiếm. Tuy nhiên, tôi cũng muốn bao gồm ngày, nơi mà các đối tượng đếm bằng 0. Làm thế nào tôi có thể làm điều đó? – dease

+0

@dease tôi đã cập nhật câu trả lời của mình để phản ánh cách thực hiện điều đó. Tôi cũng đã thay đổi mã ban đầu để sử dụng các trường ngày tháng thay vì các trường datetime. – knbk

+0

làm thế nào để đặt hàng sau này? –