DJANGO: Получение родительского кверисета из дочернего кверисета
Допустим, у меня есть следующее для моего models.py
:
from django.db import models
class Department(models.model):
name = models.CharField(max_length=255)
class User(models.model):
name = models.CharField(max_length=255)
department = models.ForeignKey(
Department, related_name="department_users", on_delete=models.CASCADE
)
...
Итак, я выполняю сложную фильтрацию набора запросов пользователей, чтобы получить подмножество пользователей, которые считаются "активными", но теперь мне нужно создать список отделов, в которых есть хотя бы один "активный" пользователь
Я знаю, что могу использовать обратный поиск, например: Department.objects.filter(department_users__name__contains=...)
и т.д. и сделать фильтрацию заново, но я хотел узнать, есть ли способ получить эту информацию непосредственно из "активного" набора запросов пользователя.
Я пытался использовать .values()
, но это дает мне набор словарей, а мне действительно нужен набор django Models, чтобы я мог сделать дальнейшую фильтрацию для набора Department.
Вы знаете, есть ли способ сделать это?
Если у вас есть набор запросов User
, вы можете загрузить user
и запросить отделы с помощью:
Department.objects.filter(department_users__in=list(queryset_of_users)).distinct()
Вы также можете сделать это без материализации списка пользователей с помощью:
Department.objects.filter(department_users__in=queryset_of_users).distinct()
здесь ваш queryset_of_users
будет подзапросом, но это означает, что база данных выполнит работу по определению активных пользователей во второй раз.
Оговорка .distinct()
предотвратит возврат Department
столько раз, сколько есть User
в queryset_of_users
для этого отдела.