简体   繁体   中英

Django count related objects

How can I count related objects in Django (in less than N queries, where N is number of object).

To clarify, let's say I have tables A and B . Every B is connected to exactly one A . Approach I tried:

A.objects.select_related().filter(attr=val)
A[i].B_set.count()

Of course, for every A[i] I want to find out number of B objects Django executes one query.

So the question is - is there a way to optimize that?

I have not tried how many queries are executed, but the Django way should be using annotate() . For example:

from django.db.models import Count

q = A.objects.select_related('B').annotate(num_B=Count('B'))
print A[0].num_B

I have to answer my own question :) If object of A is queried something like this:

A.objects.select_related().filter(atrr=val).annotate(n_b=models.Count('B'))

This creates very long query, but at least there is just one.

Since Django 2.0 Count() aggregate function accepts filter parameter , which allows applying additional restrictions on the related objects queryset. Works like this:

A.objects.select_related().annotate(
    total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need'))
).all()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM