2017-02-08 68 views
0

我是django和SQL查询的新手。我正在尝试在django中使用不同的注释。但无法获得结果。我的表看起来像在django中聚合或注释condtion

+-----------------------+-----------+---------------------+ 
| 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 | 
+-----------------------+-----------+---------------------+ 

模式是这样的:

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) 

我要为不同的事件列中的值重复计数。例如 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

如何获得与集合结果或在一个查询注释?我想要的结果像

{ 
'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

谢谢老兄!它的作用就像魅力。但我无法理解代码。你能解释一下吗? –