Как объединить запросы в 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
. Вы должны повторить другие фильтры дважды.
Так есть ли способ получить точные результаты?