Django count связанные объекты - PullRequest
       0

Django count связанные объекты

4 голосов
/ 26 августа 2010

Как подсчитать связанные объекты в Django (менее чем N запросов, где N - номер объекта).

Для пояснения, скажем, яесть таблицы A и B .Каждый B подключен ровно к одному A .Подход, который я пробовал:

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

Конечно, для каждого A [i] я хочу узнать количество B объектов, Django выполняет один запрос.

Итак, вопрос в том, есть ли способ оптимизировать это?

Ответы [ 3 ]

11 голосов
/ 26 августа 2010

Я не пробовал, сколько запросов выполняется, но для Django следует использовать annotate(). Например:

from django.db.models import Count

q = A.objects.select_related('B').annotate(num_B=Count('B'))
print A[0].num_B
4 голосов
/ 26 августа 2010

Я должен ответить на свой собственный вопрос :) Если объект A запрашивается примерно так:

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

Это создает очень длинный запрос, но по крайней мере есть только один.

0 голосов
/ 21 марта 2018

С Django 2.0 Count() агрегатная функция принимает filter параметр , что позволяет применять дополнительные ограничения к набору запросов связанных объектов.Работает так:

A.objects.select_related().annotate(
    total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need'))
).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...