Хотя нет ничего плохого в том, чтобы иметь две ссылки на одну и ту же модель, возможно, есть лучший способ решения этой конкретной проблемы.
Добавьте логическое значение к модели Team
, чтобы определить игрока + командукомбинация в качестве капитана:
class Team(models.Model):
player = models.ForeignKey(Player)
name = models.CharField(max_length=50)
is_captain = models.BooleanField(default=False)
Для поиска капитана команды:
Team.objects.filter(is_captain=True)
Лично мне не нравится этот метод, потому что семантика поискане имеет смысла (т. е. «команда» не является «капитаном»).
Другой подход заключается в определении позиции каждого игрока:
class Player(models.Model):
name = models.CharField(max_length=50)
position = models.IntegerField(choices=((1,'Captain'),(2,'Goal Keeper'))
jersey = models.IntegerField()
def is_captain(self):
return self.position == 1
class Team(models.Model):
name = models.CharField(max_length=50)
player = models.ForeignKey(Player)
def get_captain(self):
return self.player if self.player.position == 1 else None
Это делаетнемного больше смысла при поиске:
Player.objects.filter(position=1)
(вернуть всех капитанов)
Team.objects.get(pk=1).get_captain()
(вернуть капитана этой команды)
В любом случае, однакоВы должны выполнить некоторые проверки перед сохранением, чтобы убедиться, что на определенную позицию есть только один игрок.