Django 中的一对多关系

4

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

Team:  
    Contestant1
    Contestant2
    .
    .
    ContestantN

由于参赛者实际上是一个用户,我不能修改该用户以使其具有指向团队的外键。那么,实现这一点的最佳方法是什么?

我想到的方法有:

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

暂停一下

我正在重新设计我的应用程序结构,因此我将再次改写问题
感谢您的回复,我会考虑它们并查看是否有一个适合。

4个回答

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]

这允许一个用户参加不同的团队,但如果您不想允许这样做,可以在Contestant.user上添加unique=True


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

0
我会在Team模型上创建一个名为contestants的字段,如下所示:
from django.contrib.auth.models import User
contestants = models.ManyToManyField(User)

在ManyToManyField上无法指定unique=True。好消息是它不会将相同的选手添加到同一支团队两次,因此您无需检查选手是否唯一。


但是一个参赛者将能够加入两个团队。 - crodjer
没错。我的例子只是确保参赛者不能两次加入同一支队伍。 - Abid A

0
我建议你创建一个“Contestant”模型。你可能需要存储更多关于选手的与团队相关但又不同于球员的信息(例如选手是否是首发,选手的号码等)。创建一个“Contestant”模型可以让你将这些信息与“User”分开存储,并且你可以在“Contestant”模型中引用“User”的“ForeignKey”,以及在“Contestant”模型中引用“Team”的另一个“ForeignKey”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接