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

时间:2014-05-02 13:58:07

标签: python django count distinct django-queryset

这似乎是一种非常普遍的情况,所以我真的希望有人可以快速回答我。

考虑我每个站点有多个站点和多个公司的情况,我正在为此收集潜在客户。所以我有一个排行榜,每个记录都有以下字段: date site 公司(一个潜在客户可以去多家公司), 用户评论。现在我需要生成一个摘要,给出每个公司在每个日期每个日期获得的潜在客户总数。

所以基本上我需要一个查询,它会给我每个站点上每个公司的总行数。这甚至可以在一个查询中完成吗?

或者,我们可以轻松遍历网站,在这种情况下,我们只需要计算特定网站所属的每个公司的行数。

欣赏任何想法。这是一个可以使用的示例模型:

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()

2 个答案:

答案 0 :(得分:3)

所以我一直在努力解决这个问题,我相信我已经提出了一个解决方案,可以产生我之后的结果。鉴于上述模型,我使用以下内容:

Lead.objects.values('site', 'companies').annotate(Count('id'))

这会产生一个词典列表,每个唯一站点/公司组合一个词典,每个词典包含一个 id__count 键,其中包含该站点和公司特定组合的总行数。如果一个主管有多个与之关联的公司,则会为每个公司生成一个单独的字典。

在我们的实际模型中,我们还有不同类型的潜在客户以及其他字段 type 。因此,如果我也想考虑这一点,我只需在模型中添加类型字段并使用以下内容:

Lead.objects.values('site', 'companies', 'type').annotate(Count('id'))

使用这个,我会为每个公司的每个网站获得一个字典,每个公司都有自己的计数。 Django非常聪明!

无论如何,基本的问题我确定,但我找不到任何解决它的问题。希望这有助于某人。

答案 1 :(得分:2)

您可以使用distinct queryset方法。:

Lead.objects.distinct('companies', 'site', 'date').count()

您可以将所有字段(或字段)传递给distinct,以获取该行中的不同记录。然后,您只需拨打count即可。