Django Count()在多个注解中



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

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

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

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

User.objects.filter(username_startswith="ab")
            .annotate(posts=Count('post'))
            .values_list("username","posts")

让步:

[('abe', 5),('abby', 12),...]

User.objects.filter(username_startswith="ab")
            .annotate(topics=Count('topic'))
            .values_list("username","topics")

收益率:

[('abe', 2),('abby', 6),...]

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

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

收益率:

[('abe', 10, 10),('abby', 72, 72),...]

为什么主题和帖子相乘在一起?

[('abe', 5, 2),('abby', 12, 6),...]

得到正确列表的最好方法是什么?

我认为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")

尝试将distinct添加到上一个查询集:

User.objects.filter(
    username_startswith="ab").annotate(
    posts=Count('post')).annotate(
    topics=Count('topic')).values_list(
    "username","posts", "topics").distinct()

参见https://docs.djangoproject.com/en/1.3/ref/models/querysets/#distinct了解更多细节,但基本上您会得到重复的行,因为注释跨越多个表。

相关内容

  • 没有找到相关文章

最新更新