【问题标题】:one-to-many relationships with django与 django 的一对多关系
【发布时间】:2011-06-22 12:20:29
【问题描述】:

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

Team:  
    Contestant1
    Contestant2
    .
    .
    ContestantN

由于参赛者实际上是一个用户,我无法修改它以拥有一个外键来组队。实现这一目标的最佳方法是什么?

我认为的方式是:

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

暂停

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

【问题讨论】:

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


    【解决方案1】:

    你可以这样做:

    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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我会说你最好的选择是创建一个Contestant 模型。您可能最终需要存储更多关于参赛者的信息,这些信息是特定于团队但与玩家分开的(例如参赛者是否是首发,参赛者的号码等)。创建Contestant 模型允许您将该信息与User 分开存储,并且您将在Contestant 模型中拥有一个ForeignKey 引用Users,在Contestant 模型中拥有另一个ForeignKey引用Teams。

        【讨论】:

          【解决方案4】:

          我会像这样在Team 模型上创建一个contestants 字段:

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

          您不能在 ManyToManyField 上指定 unique=True。好消息是它不会将同一参赛者两次添加到同一团队中,因此您无需检查参赛者是否是唯一的。

          【讨论】:

          • 但是一个参赛者将能够在两个团队中
          • 没错。我的例子只是确保一个参赛者不能两次出现在同一个团队中。
          猜你喜欢
          • 2011-06-02
          • 2015-01-18
          • 1970-01-01
          • 2011-01-26
          • 1970-01-01
          • 2014-05-16
          • 2012-07-28
          • 1970-01-01
          • 2015-11-25
          相关资源
          最近更新 更多