отношения один-ко-многим с Джанго - PullRequest
4 голосов
/ 07 февраля 2011

Я намерен создать систему объединения команд, в которой каждая команда может содержать несколько участников. Конкурсанты на самом деле auth.User. Нечто похожее на:

Team:  
    Contestant1
    Contestant2
    .
    .
    ContestantN

Поскольку участник на самом деле является пользователем, которого я не могу изменить, чтобы иметь чужой ключ к команде. Каков наилучший способ добиться этого?

Как я думал:

  • Создайте профиль OneToOne для пользователя, который указывает на команду.
  • Определите ManyToMany отношения между пользователем и командой, где пользователь должен быть уникальным.

Пауза

Я изменяю структуру моего приложения, поэтому я перефразирую вопрос еще раз
Спасибо за ваши ответы, я их рассмотрю и посмотрю, подойдет ли один из них.

Ответы [ 4 ]

8 голосов
/ 07 февраля 2011

Вы можете сделать это:

class Team(models.Model):
    contestants = models.ManyToManyField(User, through='Contestant')

class Contestant(models.Model):
    team = models.ForeignKey(Team)
    user = models.ForeignKey(User)
    [here go Contestant data fields]

Это позволяет одному пользователю участвовать в разных командах, но если вы не хотите этого разрешать, вы можете добавить unique = True до Contestant.user .

1 голос
/ 07 февраля 2011

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

class UserExtended(models.Model):
    def __unicode__(self):
        return self.user.username

    user = models.OneToOneField(User, unique=True)
    team = models.ForeignKey(Team)

User.profile = property(lambda u: UserExtended.objects.get_or_create(user=u)[0])

Теперь вы можете использовать «UserExtended» вместо обычного пользователя.

0 голосов
/ 07 февраля 2011

Я бы сказал, что вам лучше всего создать модель Contestant. Возможно, вам в конечном итоге понадобится хранить больше информации об участнике, который зависит от команды, но отделен от игрока (например, является ли участник стартовым, номер участника и т. Д.). Создание модели Contestant позволяет хранить эту информацию отдельно от User, и у вас будет ForeignKey в модели Contestant, ссылающейся на User s, и еще один ForeignKey в модели Contestant ссылка Team с.

0 голосов
/ 07 февраля 2011

Я бы создал поле contestants для модели Team следующим образом:

from django.contrib.auth.models import User
contestants = models.ManyToManyField(User)

Вы не можете указать unique=True для ManyToManyField.Хорошей новостью является то, что он не будет добавлять одного и того же участника в одну и ту же команду дважды, поэтому вам не нужно проверять, является ли участник уникальным.

...