2013-09-23 92 views
0

我搜索一個與this one非常相似的查詢。但作爲一個擴展,我不想計算所有的對象,而只是對那些相當近的對象進行計數。Django查詢:用`count`的*窗口註釋*

在我的情況下,有兩種模式。假設一個是Source,另一個是Data。因此,我希望獲得所有Source的清單,這些清單是根據上週收集的數據記錄的數量排序的。 對我來說,它不是迭代式的,總共收集了多少條數據記錄,但是如果最近有一個該數據源的活動。

使用下面的代碼片段從上面的鏈接,我不能彌補如何子查詢Data表之前。

from django.db.models import Count 
activity_per_source = Source.objects.annotate(count_data_records=Count('Data')) \ 
      .order_by('-count_data_records') 

我想出的唯一方法是編寫原生SQL或在循環和單個查詢中處理它。是否有Django-Query版本?

(我使用MySQL數據庫和Django的1.5.4)

回答

1

結帳出來的文檔註釋和過濾器的順序:https://docs.djangoproject.com/en/1.5/topics/db/aggregation/#order-of-annotate-and-filter-clauses

嘗試沿着線的東西:

activity_per_source = Source.objects.\ 
    filter(data__date__gte=one_week_ago).\ 
    annotate(count_data_records=Count('Data')).\ 
    order_by('-count_data_records').distinct() 
+0

這個很好用!我還不熟悉'__'。這看起來有點不直觀,我過濾了一些東西,我還沒有註釋。無論如何謝謝 –

+0

我不知道這會工作,我很高興它做到了。 Django查詢的'__'確實非常有用,並不那麼直觀。 –

0

有一種方法可以通過extra與Django進行混合查詢:

start_date = datetime.date.today() - 7 
activity_per_source = (
    Source.objects 
    .extra(where=["(select max(date) from app_data where source_id=app_source.id) >= '%s'" 
      % start_date.strftime('%Y-%m-%d')]) 
    .annotate(count_data_records=Count('Data')) 
    .order_by('-count_data_records')) 

where零件將過濾源的上一個日期的Data

注意:將表和字段名稱替換爲實際名稱。