Применение JOIN вместо Subquey при использовании фильтра "__in" в Django ORM

Задача: Я хочу получить все счета-фактуры, в которых название проекта соответствует заданной строке. У Invoice есть внешний ключ к Project.

Проблема: Я хочу использовать функцию для выполнения поиска проекта, чтобы я мог переработать и инкапсулировать это использование. Для этого я должен использовать оператор __in вместо project__title__icontains=my_str. Это приведет к неэффективному подзапросу. Более поздний вариант создаст эффективный JOIN.

Примеры кода

У меня есть два пользовательских метода queryset. Один живет в Project:

def search_title(self, title: str):
    """
    Searches for projects having the given title or at least parts of it.
    """
    return self.filter(title__icontains=title)

Второй живет в Invoice:

def search_project_title(self, project_title: str):
    return self.filter(project__in=Project.objects.search_title(project_title))

Есть идеи, как я могу сообщить Django ORM, что я предпочитаю JOINs, а не Subqueries?

Thx!

В этом случае вы фильтруете с помощью:

def search_project_title(self, project_title: str):
    return self.filter(project__title__icontains=project_title)
Вернуться на верх