Как объединить запросы в django, которые охватывают отношения внешних ключей? [дубликат]

Предположим, у меня есть две модели:

class Team(models.Model):
    name = models.CharField()

class Player(models.Model):
    name = models.CharField()
    team = models.ForeignKey(Team)

Теперь я хочу отфильтровать Player объекты по их имени, а также по названию их команды. Например, если пользователь вводит aa, я хочу получить все Player, у которых aa в имени ИЛИ в имени их команды.

До сих пор я пытался использовать два таких запроса:

players = Player.objects.filter(
            name__icontains=request.GET.get("q", ""),
            # ...other filters
          )
more = Player.objects.filter(
            team__name__icontains=request.GET.get("q", ""),
            # ...other filters
       )
players = players.union(more)

Это дает результаты, но у него есть свои проблемы:

i) Выдает дублирующиеся результаты в случаях, когда поисковый запрос совпадает и с именем игрока, и с названием команды (метод .union не поддерживает .distinct)

ii) Он выполняет поиск в базе данных дважды, что может быть дорогостоящей операцией. Поэтому я хотел бы, чтобы она выполнялась только в одном запросе.

iii) Это не DRY. Вы должны повторить другие фильтры дважды.

Так есть ли способ получить точные результаты?

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