Ernst
Ernst

Reputation: 514

Multiple annotations on related objects

I'm trying to calculate some related objects for user using Django ORM.

As for example I have 3 models: User, A, B

class A(models.Model):
    creator = models.ForeignKey(
        'users.User', on_delete=models.CASCADE, related_name='A_set'
    )


class B(models.Model):
    creator = models.ForeignKey(
        'users.User', on_delete=models.CASCADE, related_name='B_set'
    )
    a_model = models.ForeignKey(
        'a.A', on_delete=models.CASCADE, related_name='B_set'
    )

My query looks like:

User.objects.annotate(a_count=Count('a_set')).annotate(b_count=Count('b_set'))

When b_count always copying value a_count except when real number of b objects is 0. But when I'm splitting my query into two separate - it works good.

Upvotes: 1

Views: 107

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47354

You should use Count with distinct=True argument:

User.objects.annotate(a_count=Count('a_set', distinct=True), b_count=Count('b_set', distinct=True))

Upvotes: 1

Related Questions