【问题标题】:Django annotate count with a distinct fieldDjango用不同的字段注释计数
【发布时间】:2012-10-20 03:53:23
【问题描述】:

我有两个松散定义的模型,如下所示:

class InformationUnit(models.Model):
    username = models.CharField(max_length=255)
    project = models.ForeignKey('Project')
    ...

class Project(models.Model):
    name = models.CharField(max_length=255)

现在,在一个视图中,我想注释属于一个项目的所有InformationUnits,所以我这样做:

p = Project.objects.all().annotate(Count('informationunit')

效果很好。

此外,我想知道,在每个项目中,有多少不同的usernames 参与。 也就是说,计算组成一个项目的InformationUnits 中有多少不同的usernames。 我尝试了以下方法,但它只是计算InformationUnit的数量,而不考虑username

p = Project.objects.all().annotate(Count('informationunit__username')

注意username 不是一个对象,它是一个字符串。有没有一种干净的方法可以做到这一点,或者我应该基于循环和意大利面条代码创建一个更复杂的代码:P

非常感谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    Count 可以接受 distinct 参数,如下所示:

    p = Project.objects.all().annotate(Count('informationunit__username', 
                                             distinct=True))
    

    这似乎没有记录,但您可以在 Count 的源代码中找到它。

    【讨论】:

    • 成功了!我在某个地方找到了这个,甚至尝试过(实际上这是我在这里提出问题之前做的最后一件事)。一开始它没有用,但今天重新启动开发服务器后再次尝试,它成功了:P 非常感谢!
    • 记录在案(现在,无论如何):docs.djangoproject.com/en/dev/ref/models/querysets/…
    【解决方案2】:

    如果你只想计算不同的值,你可以使用 distinct() 和 count() 函数:

    count = Project.objects.values('informationunit__username').distinct().count()
    

    【讨论】:

    • 谢谢,这就是我要找的。接受的答案返回一个对象列表。您的解决方案对我有用。
    【解决方案3】:
    Project.objects.all().annotate(Count('informationunit__username', 
                                         distinct=True))
    

    【讨论】:

      【解决方案4】:

      SQLSELECT field1, COUNT(DISTINCT(pk)) FROM project GROUP BY field1 ORDER BY NULL;

      查询集

      Project.objects.all().values(field1).annotate(count=Count('pk', distinct=True)).order_by()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2023-02-14
        • 2021-07-31
        • 2016-03-16
        • 1970-01-01
        • 2019-01-13
        相关资源
        最近更新 更多