2017-02-08 10 views
0

djangoとSQLのクエリが初めてです。私はdjangoで別名でいくつかの注釈をしようとしています。結果を得ることができません。djangoでcondtionを集約するか注釈を付ける

class EmailEvent(models.Model): 
    event = models.TextField(blank=True, null=True) 
    email = models.TextField(blank=True, null=True) 
    event_date = models.DateTimeField(blank=True, null=True) 

私は別のイベントの列の値に対して個別のカウントをしたい:私のテーブルは

+-----------------------+-----------+---------------------+ 
| email     | event  | event_date   | 
|-----------------------+-----------+---------------------| 
| [email protected] | open  | 2017-01-03 13:26:13 | 
| [email protected] | delivered | 2017-01-03 13:26:28 | 
| [email protected] | open  | 2017-01-03 13:26:33 | 
| [email protected] | open  | 2017-01-03 13:26:33 | 
| [email protected] | open  | 2017-01-03 13:34:53 | 
| [email protected] | click  | 2017-01-03 13:35:22 | 
| [email protected] | open  | 2016-09-05 00:00:00 | 
| [email protected] | open  | 2016-09-17 00:00:00 | 
| [email protected] | open  | 2017-01-03 16:05:36 | 
| [email protected] | open  | 2017-01-03 20:12:15 | 
| [email protected] | open  | 2017-01-03 22:06:47 | 
| [email protected] | click  | 2017-01-09 19:46:26 | 
| [email protected] | open  | 2017-01-09 19:47:59 | 
| [email protected] | open  | 2017-01-09 19:48:28 | 
| [email protected] | delivered | 2017-01-09 19:52:24 | 
+-----------------------+-----------+---------------------+ 

のように見えるモデルのようなものです。例えば EmailEvent.objects.filter(event='open').distinct('email').count()結果3つの EmailEvent.objects.filter(event='click').distinct('email').count()結果2つの EmailEvent.objects.filter(event='delivered').distinct('email').count()結果2

どのように骨材となるか、1つのクエリに注釈を付ける取得しますか?結果が欲しい

{ 
'open': 3, 
'click': 2, 
'delivered': 2, 
} 

ありがとう!

答えて

0

は、次のクエリを使用してみてください:

from django.db.models import Q, Count, Case, When # probably need Django 1.8+ 

EmailEvent.objects.values('email').distinct()\ 
    .annotate(open_count=Case(When(Q(event="open"), then=1)), 
       click_count=Case(When(Q(event="click"), then=1)), 
       delivered_count=Case(When(Q(event="delivered"), then=1)))\ 
    .aggregate(open=Count("open_count"), 
       click=Count("click_count"), 
       delivered=Count("delivered_count")) 
+0

おかげで仲間!それは魅力のように働く。しかし、私はコードを理解することができません。説明してくれますか? –

関連する問題