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 для этого отдела.

Вернуться на верх