2008-10-31 135 views
3

我正试图设计一个应用程序的模型,允许2人互相打赌(我知道,听起来很愚蠢......)。我想知道的是如何将赌注与用户连接起来。该结构是这样的django设计模型结构

|-------------|  |----------| 
| Bet  |  | User  | 
| BetUser1 |  |----------| 
| BetUser2 | 
| Winner  | 
| ...   | 
|-------------| 

所以我们用了2人,与对方打赌(均为Users从Django的身份验证系统),然后其中一人获胜后,有一个赢家。现在,所有这3个领域是User类型,但:

  • 我应该BetUser1和BetUser2独立的领域,或在这里设计一些许多对二的关系? (其中多到二为多对多,并且有一些外部方式可以确保每个投注都不会分配2 Users
  • 赢家只能是用户1或用户2,其他人当然,我应该如何创建这个领域,另一个ForeignKey(User),或者一些别的吗?

只是在寻找的观点一些新鲜的点,因为它似乎在这样的情况下,愚蠢的我卡与Django的模型系统。

回答

4

我可能会添加第三个模型来表示某人已下注的特定投注,因为可以想象有两个以上的人可以进入投注,它看起来像这样:

USER  WAGER    BET 
      User (FK(User)) Description 
      Bet (FK(Bet))  Winner (FK (Wager), null=True) 
      Amount 

Django会自动生成基于外键user.wager_setbet.wager_set。这使您可以轻松地迭代并显示下注的投注以及每位用户的投注。您还可以在Wager表中的UserBet上添加unique_together约束,以便每个用户只能进行一次投注。

当投注全部完成,并且选择了赢家时,您只需设置bet.winner即可。

在你碰到它时,你可能会看到一个警告具有BetWagerWagerBetrelated_name。要修复,只需将related_name=wagers添加到Wager.bet即可。

+0

这需要一个约束来限制它为同一个Bet的两个Wager实例。我建议添加一个方法来检查这个,并且在有人试图为给定的投注保存第三个投注时引发异常。 – 2008-10-31 13:44:26

1

你需要的是额外的数据多到许多关系(例如,在下注的金额,时间,...)

有这个一个chaper中的出色Django文档上写模型。

Tyler已经为此概述了适当的模式。