Применение 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)