2008-10-31 189 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已經爲此概述了適當的模式。