Django Count()在多个注释中

use*_*618 40 django annotations count django-queryset

说我有一个简单的论坛模型:

class User(models.Model):
    username = models.CharField(max_length=25)
    ...

class Topic(models.Model):
    user = models.ForeignKey(User)
    ...

class Post(models.Model):
    user = models.ForeignKey(User)
    ...
Run Code Online (Sandbox Code Playgroud)

现在说我想查看用户子集的每个用户有多少主题和帖子(例如,他们的用户名以"ab"开头).

所以,如果我为每个帖子和主题做一个查询:

User.objects.filter(username_startswith="ab")
            .annotate(posts=Count('post'))
            .values_list("username","posts")
Run Code Online (Sandbox Code Playgroud)

Yeilds:

[('abe', 5),('abby', 12),...]
Run Code Online (Sandbox Code Playgroud)

User.objects.filter(username_startswith="ab")
            .annotate(topics=Count('topic'))
            .values_list("username","topics")
Run Code Online (Sandbox Code Playgroud)

产量:

[('abe', 2),('abby', 6),...]
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试注释两个以获得一个列表时,我得到一些奇怪的东西:

User.objects.filter(username_startswith="ab")
            .annotate(posts=Count('post'))
            .annotate(topics=Count('topic'))
            .values_list("username","posts", "topics")
Run Code Online (Sandbox Code Playgroud)

产量:

[('abe', 10, 10),('abby', 72, 72),...]
Run Code Online (Sandbox Code Playgroud)

为什么主题和帖子成倍增加?我期待这个:

[('abe', 5, 2),('abby', 12, 6),...]
Run Code Online (Sandbox Code Playgroud)

获得正确列表的最佳方法是什么?

fha*_*ahn 97

我认为Count('topics', distinct=True)应该做正确的事情.这将使用COUNT(DISTINCT topic.id)而不是COUNT(topic.id)避免重复.

User.objects.filter(
    username_startswith="ab").annotate(
    posts=Count('post', distinct=True)).annotate(
    topics=Count('topic', distinct=True)).values_list(
    "username","posts", "topics")
Run Code Online (Sandbox Code Playgroud)

  • 对于ref:https://docs.djangoproject.com/en/dev/topics/db/aggregation/#combining-multiple-aggregations (4认同)
  • 这个答案应该被接受,它救了我! (2认同)