【问题标题】:In Django, how could I in a single query get total row count based on distinct field values?在 Django 中,如何在单个查询中根据不同的字段值获取总行数?
【发布时间】:2014-05-02 13:58:07
【问题描述】:

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

假设我有多个站点,每个站点有多个公司,我正在为其收集潜在客户。所以我有一个潜在客户表,其中每条记录都有以下字段:datesitecompanies(一个潜在客户可以去多个公司), 用户评论。现在我需要生成一个摘要,给出每个公司在每个日期在每个站点上获得的潜在客户总数。

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

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

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

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

【问题讨论】:

  • 发布你的模型定义真的很有帮助。谢谢。

标签: python django count distinct django-queryset


【解决方案1】:

所以我一直在摆弄这个,我相信我已经想出了一个能够产生我所追求的结果的解决方案。鉴于上述模型,我正在使用以下内容:

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

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

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

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

使用它,我会为每个站点、每个类型、每个公司获得一本字典,每个字典都有自己的数量。 Django 很聪明!

无论如何,我确定这是基本问题,但我找不到任何可以解决的问题。希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    您可以使用distinct 查询集方法。:

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

    您可以将任何字段(或多个字段)传递给 distinct 以获得该行中的不同记录。然后你可以简单地调用count就可以了。

    【讨论】:

    • 试过了,看起来这让我计算了有多少不同的行组,其中每一个都是唯一的。但我需要知道每组中的行数。认为我找到了解决方案,但感谢您的意见。
    猜你喜欢
    • 2018-10-03
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多