Джанго моделирует пару - PullRequest
       7

Джанго моделирует пару

2 голосов
/ 12 августа 2011

В настоящее время я играю с Джанго и хочу смоделировать простое отношение: два члена танцевального клуба должны быть объединены в пару, чтобы участвовать в танцевальном турнире У меня уже есть простая модель для участников:

class Member(models.Model):
  firstname = models.CharField(max_length=32)
  lastname  = models.CharField(max_length=32)
  member_id = models.IntegerField(unique=True)
  def __unicode__(self):
    return self.firstname + ' ' + self.lastname

У меня также есть турнир Модель:

class Tournament(models.Model):
  name = models.CharField(max_length=32)
  def __unicode__(self):
    return self.firstname + ' ' + self.lastname

Поскольку участник турнира - пара, мне нужно определить отношение пары (по крайней мере, это мое предположение). Но я действительно не понимаю, как бы я это сделал.

TIA за любую помощь и советы

Ответы [ 4 ]

3 голосов
/ 12 августа 2011

Возможно, вы можете попытаться определить модель, называемую чем-то вроде пары, и две взаимосвязи внешних ключей с таблицей участников, с отношением к турниру, в котором они находятся:

class Couple(models.Model):
    partner_a = models.ForeignKey(Member)
    partner_b = models.ForeignKey(Member)
    tournament = models.ForeignKey(Tournament)

Я не уверен в ваших требованиях, но способ, которым я представил, позволяет участникам быть частью нескольких пар, и пара уникальна для турнира. В зависимости от того, как вы хотите это сделать, вы можете захотеть исправить пары (т.е. Стейси и Боб всегда танцуют вместе). В этом случае вы, вероятно, захотите иметь отношения «многие ко многим» от Турнира до пары:

class Tournament(models.Model):
    couples = models.manyToManyField(Couple)

Таким образом, пара может участвовать во многих турнирах, и в турнире может быть много пар.

1 голос
/ 12 августа 2011

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

Но в рамках турнира каждый участник может быть только частьюодной пары.

Если вышесказанное выполнено, я бы сделал,

class TournamentRegistration(models.Model):
    tournament = models.ForeignKey("Tournament")
    dancer_1 = models.ForeignKey("Member")
    dancer_2 = models.ForeignKey("Member")
    # ...etc
1 голос
/ 12 августа 2011

Один из способов - дать каждому члену партнера:

partner = models.OneToOneField('self')

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

class Couple(models.Model):
  tournament = models.ForeignKey('Tournament')
  member1 = models.ForeignKey('Member')
  member2 = models.ForeignKey('Member')
1 голос
/ 12 августа 2011

Вы можете использовать отношение OneToOneField для сопоставления элементов другим элементам.

class Member(models.Model):
  firstname = models.CharField(max_length=32)
  lastname  = models.CharField(max_length=32)
  member_id = models.IntegerField(unique=True)
  partner = models.OneToOneField('Member', unique=True) #This should suffice.
  def __unicode__(self):
    return self.firstname + ' ' + self.lastname
...