我是django和SQL查询的新手。我在django中尝试使用不同的注释。但无法得到结果。我的表看起来像
+-----------------------+-----------+---------------------+
| email | event | event_date |
|-----------------------+-----------+---------------------|
| hector@example.com | open | 2017-01-03 13:26:13 |
| hector@example.com | delivered | 2017-01-03 13:26:28 |
| hector@example.com | open | 2017-01-03 13:26:33 |
| hector@example.com | open | 2017-01-03 13:26:33 |
| tornedo@example.com | open | 2017-01-03 13:34:53 |
| tornedo@example.com | click | 2017-01-03 13:35:22 |
| tornedo@example.com | open | 2016-09-05 00:00:00 |
| tornedo@example.com | open | 2016-09-17 00:00:00 |
| sparrow@example.com | open | 2017-01-03 16:05:36 |
| tornedo@example.com | open | 2017-01-03 20:12:15 |
| hector@example.com | open | 2017-01-03 22:06:47 |
| sparrow@example.com | click | 2017-01-09 19:46:26 |
| sparrow@example.com | open | 2017-01-09 19:47:59 |
| sparrow@example.com | open | 2017-01-09 19:48:28 |
| sparrow@example.com | 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 :(得分: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"))