Использование 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)