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