Django Count() in multiple annotations

后端 未结 2 1119
我寻月下人不归
我寻月下人不归 2021-01-30 20:34

Say I have a simple forum model:

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

class Topic(models.Model):
    user = models.F         


        
相关标签:
2条回答
  • 2021-01-30 21:11

    I think Count('topics', distinct=True) should do the right thing. That will use COUNT(DISTINCT topic.id) instead of COUNT(topic.id) to avoid duplicates.

    User.objects.filter(
        username_startswith="ab").annotate(
        posts=Count('post', distinct=True)).annotate(
        topics=Count('topic', distinct=True)).values_list(
        "username","posts", "topics")
    
    0 讨论(0)
  • 2021-01-30 21:13

    Try adding distinct to your last queryset:

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

    See https://docs.djangoproject.com/en/1.3/ref/models/querysets/#distinct for more details, but basically you're getting duplicate rows because the annotations span multiple tables.

    0 讨论(0)
提交回复
热议问题