Django: поле ManyToMany с несколькими полями fk

#python #django

#python #django

Вопрос:

Вот упрощенная версия моих моделей (Django 1.9, если это имеет значение):

 class Player(models.Model):
    name = models.StringField()

class Match(models.Model):
    player_1 = models.ForeignKey(Player, related_name="player_1")
    player_2 = models.ForeignKey(Player, related_name="player_2")
  

Есть ли какой-либо способ добавить player.matches поле в модель, которое запрашивало бы все совпадения, где находится игрок player_1 или player_2 ? В частности, я хочу сделать это, чтобы воспользоваться select_related() для сокращения n 1 запросов при получении совпадений для каждого игрока

Я знаю, что могу переструктурировать базу данных для поддержки этого, но предпочел бы этого не делать.

Комментарии:

1. Я думаю, что player.player1.all() и player.player2.all() в совокупности выдадут вам все совпадения

Ответ №1:

Самым простым способом было бы обратное слияние запросов.

 class Player(models.Model):
    name = models.StringField()

    def matches(self):
        return self.player_1.all() | self.player_2.all()
  

Комментарии:

1. Идеально — и это работает с prefetch_related. Огромное спасибо!