与django的一对多关系

时间:2011-02-07 03:13:54

标签: django django-models foreign-key-relationship

我打算创建一个团队系统,每个团队可能包含多个参赛者。参赛者实际上是auth.User。类似于:

Team:  
    Contestant1
    Contestant2
    .
    .
    ContestantN

由于参赛者实际上是一个我无法修改的用户,因此无法与团队合作。实现这一目标的最佳方法是什么?

我的方式是:

  • 为用户创建指向团队的OneToOne个人资料。
  • 在用户和团队之间定义ManyToMany关系,其中用户必须是唯一的。

暂停

我正在重新设计我的应用程序的结构,所以我将再次重新解释这个问题 感谢您的回复,我会考虑他们,看看他们中的一个是否合适。

4 个答案:

答案 0 :(得分:8)

你可以这样做:

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 :(得分:1)

最好的方法是扩展默认帐户的功能并创建新的用户模型。然后,新用户模型可以拥有团队的外键。像这样。

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"代替普通用户。

答案 2 :(得分:0)

我会在contestants模型上创建一个Team字段,如下所示:

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

您无法在ManyToManyField上指定unique=True。好消息是它不会将同一个参赛者添加到同一个团队两次,所以你不需要检查参赛者是否是唯一的。

答案 3 :(得分:0)

我想说你最好的办法是创建一个Contestant模型。您可能最终需要存储有关团队特定但与玩家分开的参赛者的更多信息(例如参赛者是先发球员,参赛者的号码等等)。通过创建Contestant模型,您可以将该信息与User分开存储,并且ForeignKey模型中的Contestant引用User,引用ForeignKey的{​​{1}}模型中的另一个Contestant