这似乎是一个很常见的场景,所以我真的希望有人能给我一个快速的答案。
考虑这样一个场景,我有多个网站,每个网站有多个公司,我正在收集线索。所以我有一个lead表,其中每个记录都有以下字段:日期, 站点, 公司(一个lead可以去多个公司),用户, 评论。现在我需要生成一个摘要,给出每个公司在每个日期在每个网站上获得的潜在客户总数。
所以基本上我需要一个查询,将给我每个网站上的每个公司的行总数。这可能在单个查询中完成吗?
或者,我们可以很容易地遍历站点,在这种情况下,我们只需要计算给定特定站点下属于每个公司的行数。
感谢所有的想法。下面是一个示例模型:
class Lead(models.Model):
date = models.DateTimeField(auto_now_add=True)
site = models.ForeignKey(Site)
companies = models.ManyToManyField(Company)
user = models.ForeignKey(User)
comment = models.TextField()
所以我一直在摆弄这个,我相信我已经想出了一个解决方案,产生我所追求的结果。对于上面的模型,我使用以下命令:
Lead.objects.values('site', 'companies').annotate(Count('id'))
这会产生一个字典列表,每个唯一的站点/公司组合一个字典,每个字典包含一个id__count键,其中包含特定站点和公司组合的总行数。如果一个线索有多个公司与之关联,则为每个公司生成一个单独的字典。
在我们的实际模型中,我们也有不同类型的线索和一个额外的字段类型。因此,如果我也想考虑到这一点,我只需在模型中添加一个类型字段,并使用以下命令:
Lead.objects.values('site', 'companies', 'type').annotate(Count('id'))
使用此方法,我将得到每个站点、每种类型、每个公司都有一个字典,每个都有自己的计数。Django非常聪明!
无论如何,我确定基本问题,但我找不到任何解决它的东西。
您可以使用distinct
queryset方法:
Lead.objects.distinct('companies', 'site', 'date').count()
您可以将任意字段(或多个字段)传递给distinct,以在该行中获得不同的记录。然后你可以简单地调用count