2017-04-04 23 views
1

我正在計數用戶從DateTime字段註冊的日期。數據庫中存儲爲'2016-10-31 20:49:38',但我只對日期'2016-10-31'有興趣。Django計數組從日期時間的日期

原始SQL查詢:

select DATE(registered_at) registered_date,count(registered_at) from User 
where course='Course 1' group by registered_date; 

有可能使用「額外」的,但我讀過這個被廢棄,不應該做的。它的工作原理如下:

User.objects.all() 
    .filter(course='Course 1') 
    .extra(select={'registered_date': "DATE(registered_at)"}) 
    .values('registered_date') 
    .annotate(**{'total': Count('registered_at')}) 

有沒有可能不使用額外的?

我讀到TruncDate可以用,我認爲這是正確的queryset但它不工作:

User.objects.all() 
    .filter(course='Course 1') 
    .annotate(registered_date=TruncDate('registered_at')) 
    .values('registered_date') 
    .annotate(**{'total': Count('registered_at')}) 

我得到<QuerySet [{'total': 508346, 'registered_date': None}]>所以有一些與TruncDate走錯了。

如果有人比我更瞭解這一點,並可以指出我正確的方向,將不勝感激。

感謝您的幫助。

+1

我只是使用額外的,這正是它所做的。目前還沒有廢棄,不要認爲它不會很快,也不是沒有先給我們一些替代解決方案,因爲目前它是這類問題的唯一選擇。所以我不會擔心。 – serg

回答

0

from django.db.models import Count 

User.objects.values_list('registered_at')\ 
    .filter(course=1)\ 
    .annotate(count_user=Count('registered_at'))\ 

嘗試查詢將是:

SELECT "user"."registered_at", COUNT("user"."registered_at") AS "count" FROM "user" WHERE "user"."course" = 1 GROUP BY "user"."registered_at" 

希望這有助於:)

+0

這不起作用,因爲它是按日期時間而不是日期分組的。我需要根據日期時間字段的日期進行分組,因此使用TruncDate。 –

0

我試圖做一些非常相似,並有同樣的問題,你。在應用TruncDate註釋之後,我通過在order_by子句中添加了問題,從而解決了我的問題。所以我想這應該也適用於你:

User.objects.all() 
    .filter(course='Course 1') 
    .annotate(registered_date=TruncDate('registered_at')) 
    .order_by('registered_date') 
    .values('registered_date') 
    .annotate(**{'total': Count('registered_at')}) 

希望這有助於?