我打算创建一个团队系统,每个团队可能包含多个参赛者。参赛者实际上是auth.User
。类似于:
Team:
Contestant1
Contestant2
.
.
ContestantN
由于参赛者实际上是一个我无法修改的用户,因此无法与团队合作。实现这一目标的最佳方法是什么?
我的方式是:
OneToOne
个人资料。ManyToMany
关系,其中用户必须是唯一的。我正在重新设计我的应用程序的结构,所以我将再次重新解释这个问题 感谢您的回复,我会考虑他们,看看他们中的一个是否合适。
答案 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
。