设计django的模型结构

时间:2008-10-31 12:08:56

标签: django database-design django-models

我正在尝试为应用程序设计一个模型,允许2个人互相打赌(我知道,这听起来很愚蠢......)。我想知道的是如何将赌注与用户联系起来。结构就像这样

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

所以我们有两个人互相打赌(两者都是来自django auth系统的Users)然后,在他们中的一个获胜之后,就会有一个胜利者。现在所有这3个字段都是User类型,但是:

  • 我应该将BetUser1和BetUser2分开制作字段,还是设计一些多对二的关系? (多对二是多对多,并且有一些外部方式可以确保每次下注不超过2 Users
  • 获胜者当然只能是用户1或用户2,而不是其他人。我应该如何创建此字段,另一个ForeignKey(User)或其他?

只是寻找一些新的观点,因为在这种愚蠢的情况下我似乎坚持使用django模型系统。

2 个答案:

答案 0 :(得分:4)

我可能会添加第三个模型来代表某人放置的特定赌注,因为可以想象有两个以上的人可以进行赌注。它看起来像这样:

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

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

当投注全部完成并且选择了获胜者后,您只需设置bet.winner

如果您遇到此问题,您可能会在related_name指向BetWager指向Wager时看到有关Bet的警告。要解决此问题,只需将related_name=wagers添加到Wager.bet

答案 1 :(得分:1)

您需要的是与额外数据的多对多关系(例如投注金额,输入时间,......)

在编写模型的优秀Django文档中有一个chaper

泰勒已经为此概述了正确的架构。