2017-04-04 2 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を使用することができることを読んで、私は、これはしかし、それは動作しません正しいクエリセットであると思う:

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と間違って行くものがあります。

誰かが私よりもこのことを良く理解しており、正しい方向に向けることができればそれは大いに感謝します。

ありがとうございました。

from django.db.models import Count 

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

+1

私はちょうど余分なものを使います、これはまさにそれが作られたものです。現在のところ、このような問題の唯一の選択肢であるため、いつでもすぐに代替ソリューションを提供する必要はありません。だから私はそれについて心配しないだろう。 – serg

答えて

0

してみたクエリは次のようになります。

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

希望はこのことができます:)

+0

これは日付の代わりに日時によってグループ化されているので機能しません。私はdatetimeフィールドから日付でグループ化する必要があります。したがって、Truncateを使用してください。 –

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

これは役に立ちますか?

関連する問題