我正在开发一个大型Django应用程序,特别是其中的一部分,该应用程序发出许多电子邮件,然后收集有关它们的信息。我有两个通过第三个模型相互关联的模型:
SendEvent是一种用于在我成功发送任意数量的电子邮件时捕获的模型-它记录了一些与问题无关的数据。
SentEmail是中间表。它包含对SendEvent的外键引用,名为sendevent以及其他一些附加信息。
然后,我有了一个名为EmailEvents的模型,该模型正在侦听我正在使用的第三方邮件应用程序中的某些webhooks,并存储有关收件人对我的电子邮件进行处理的信息。该模型包含对SentEmail对象的外键引用。有多个与单个SentEmail关联的EmailEvent-最相关的是“已发送”和“已打开”(发送电子邮件时,将生成已发送事件并记录在EmailEvents表中,并通过唯一的ID字符串进行关联与SentEmail相似。与打开事件类似,不同的是它是在收件人打开电子邮件时生成的。事件的类型以字符串形式存储在名为event的字段中。
我正在尝试编写一个查询,该查询具有给定的SendEvent,可以让我对关联的EmailEvent的不同类型进行计数。
到目前为止,我已经解决了以下问题(send_event是包含对相关SendEvent的引用的变量):
email_events = EmailEvents.objects.filter(sent_mail__sendevent = sent_event)
我相信这将获取所有正确的EmailEvent对象(那些与与给定SendEvent关联的SentEmails关联的对象)。然后,我可以在其末尾添加.count()并获取所有EmailEvent的计数。不过,我真正想要的是将其拆分为不同类型的EmailEvents。我可以通过遍历QuerySet来手动执行此操作,但是我预计EmailEvents表会变得很大,所以我非常希望让ORM替我完成此工作。如何按事件将这些分组?
我可不可以做
EmailEvents.objects.filter(sent_mail__sendevent = sent_event).annotate(Count('event'))
那是最好的方法吗?那会起作用吗?任何建议都将不胜感激-我在处理大量数据方面还有些陌生。
这可以通过将objects.values与注释一起使用来实现。这是一个样本模型+测试。
首先在您的models.py中
class Foo(models.Model):
action_type = models.CharField(max_length=50)
然后在tests.py中
from django.test import TestCase
from django.db.models import Count
from foo.models import Foo
class MyTestCase(TestCase):
def test_group_query(self):
options = ('created', 'deleted', 'updated')
for i in range(32):
Foo.objects.create(
action_type=options[i%3]
)
results = Foo.objects.values('action_type').annotate(Count('action_type'))
print results
产生一个具有以下内容的数组
{'action_type__count': 11, 'action_type': u'created'},
{'action_type__count': 11, 'action_type': u'deleted'},
{'action_type__count': 10, 'action_type': u'updated'}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句