Django - Возможно ли предварительно получить несколько фильтров одного поля для набора запросов?

Я знаю, что вы можете предварительно получить один отфильтрованный набор запросов, например

Parent.objects.all()
.prefetch_related(
  Prefetch("child_set", queryset=Child.objects.filter(type="A")
)

Таким образом, выполнение obj.child_set.all().count() вернет count связанных A Child без выполнения другого запроса.

Но что если я захочу, чтобы подсчитывались и B? Таким образом, потребуется 2 запроса - могу ли я как-то предварительно получить их оба?

return {
  "a_count": obj.log_set.filter(type="A").all().count(),
  "b_count": obj.log_set.filter(type="B").all().count(),
}

Редактировать: Я пробовал

Parent.objects.all()
.prefetch_related(
  Prefetch("child_set", queryset=Child.objects.filter(type="A"),
  Prefetch("child_set", queryset=Child.objects.filter(type="B")
)

Но это дает мне следующую ошибку, когда я пытаюсь получить доступ к объекту:

{
    "detail": "Not found."
}

Что касается вашего основного вопроса, вы можете использовать Prefetch...[Django-doc] объект на одном поле с разными фильтрами, но присвоить им разные to_attr значения следующим образом:

from django.db.models import Prefetch


Parent.objects.prefetch_related(
    Prefetch(
        "child_set", 
        queryset=Child.objects.filter(type="A"), 
        to_attr="child_set_a"
    ),
    Prefetch(
        "child_set", 
        queryset=Child.objects.filter(type="B"), 
        to_attr="child_set_a"
    ),
)
Вернуться на верх