Использование QueryManager в фильтре после SelectRelated

Я пытаюсь сделать select_related join в Django с последующей фильтрацией.

queryset = Foo.foo_manager.all().select_related("bar").filter(
    bar__field_1__gt=0,
    bar__field_2=1,
    bar__field_3__lt=100,
    bar__field_4="X",
)

Но класс Bar уже имеет свой собственный менеджер запросов bar_manager, который получает все экземпляры, соответствующие этому условию. Есть ли способ использовать его после select_related? Например,

 queryset = Foo.foo_manager.all().select_related("bar").filter(bar__bar_manager__all=True)

Насколько я знаю, это невозможно. Однако вы можете создать переменную в классе менеджера, содержащую группу объектов Q(). Затем вы можете повторно использовать этот фильтр в других областях вашего приложения следующим образом:

# managers.py

class BarManager(models.Manager):
   BAR_FILTER = Q(field_1__gt=0) & Q(field_2=1) & ...
   
   def get_queryset(self):
      return super().get_queryset().filter(self.BAR_FILTER)

И затем в ваших представлениях или где бы то ни было:

from .managers import BarManager

foo.bar_set.filter(BarManager.BAR_FILTER)
Вернуться на верх