在Django中,我如何在单个查询中获得基于不同字段值的总行数



这似乎是一个很常见的场景,所以我真的希望有人能给我一个快速的答案。

考虑这样一个场景,我有多个网站,每个网站有多个公司,我正在收集线索。所以我有一个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

相关内容

  • 没有找到相关文章

最新更新