Django.fun

Django - Is it possible to prefetch multiple filters of a single field for a queryset?

I know you can prefetch a single filtered queryset E.g.

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

That way running obj.child_set.all().count() will return the count of related A Childs without running another query.

But what if I wanted to have the B count too? So the following would take 2 queries - can I somehow prefetch them both?

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

Edit: I've tried

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

But that gives me the following error when I try to access the object:

{
    "detail": "Not found."
}

With regards to your main question, you can use Prefetch..[Django-doc] object on the same field with different filters, but assign them with different to_attr values like this:

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"
    ),
)

Tutorials

Современный Python: начинаем проект с pyenv и poetry

Настройка проекта Python — виртуальные среды и управление пакетами

Использование requests в Python — тайм-ауты, повторы, хуки

Понимание декораторов в Python

ProcessPoolExecutor в Python: полное руководство

map() против submit() с ProcessPoolExecutor в Python

Понимание атрибутов, словарей и слотов в Python

Полное руководство по slice в Python

Выпуск Django 4.0

Безопасное развертывание приложения Django с помощью Gunicorn, Nginx и HTTPS

Автоматический повтор невыполненных задач Celery

Django REST Framework и Elasticsearch

Докеризация Django с помощью Postgres, Gunicorn и Nginx

Асинхронные задачи с Django и Celery

Релизы безопасности Django: 3.2.4, 3.1.12 и 2.2.24

Выпуски исправлений ошибок Django: 3.2.3, 3.1.11 и 2.2.23

Эффективное использование сериализаторов Django REST Framework

Выпуски безопасности Django: 3.2.2, 3.1.10 и 2.2.22

Выпущенные релизы безопасности Django: 3.2.1, 3.1.9 и 2.2.21

Обработка периодических задач в Django с помощью Celery и Docker

View all tutorials →