djangoのモデル構造の設計
-
05-07-2019 - |
質問
私は、2人が互いに賭けることを許可するアプリケーションのモデルを設計しようとしています(ばかげているように聞こえますが...)。私が疑問に思っているのは、ベットをユーザーと結び付ける方法です。構造は次のとおりです
|-------------| |----------|
| Bet | | User |
| BetUser1 | |----------|
| BetUser2 |
| Winner |
| ... |
|-------------|
だからお互いに賭けた2人(両方ともdjango認証システムの Users
)がいて、そのうちの1人が勝った後、勝者がいます。これら3つのフィールドはすべて User
タイプですが、次のとおりです。
- BetUser1とBetUser2を別々のフィールドにするか、ここで多対2の関係を設計する必要がありますか? (多対2が多対多で、各ベットに割り当てられる
Users
が2人を超えないようにする外部的な方法がある場合 - 勝者は、ユーザー1またはユーザー2のいずれかのみです。このフィールド、さらに別の
ForeignKey(User)
、またはその他のフィールドを作成するにはどうすればよいですか?
このような愚かなケースではdjangoモデルシステムに固執しているように見えるため、新しい観点を探しているだけです。
解決
おそらく、3人目のモデルを追加して、誰かが賭けた特定の賭け金を表すでしょう。2人以上が賭けに参加する可能性があるためです。次のようになります:
USER WAGER BET
User (FK(User)) Description
Bet (FK(Bet)) Winner (FK (Wager), null=True)
Amount
Djangoは、外部キーに基づいて user.wager_set
および bet.wager_set
を自動的に生成します。これにより、賭けの賭け金と各ユーザーの賭け金を簡単に繰り返し表示することができます。また、Wagerテーブルの User
および Bet
に unique_together
制約を追加して、各ユーザーが1回だけ賭けることができるようにします。
賭けがすべて完了し、勝者が選択されたら、単に bet.winner
を設定します。
これに遭遇した場合、 Bet
が Wager
および Wager <を指すようにすることで、
related_name
に関する警告が表示される場合があります。 / code>は Bet
を指します。修正するには、 related_name = wagers
を Wager.bet
に追加するだけです。
他のヒント
必要なのは、追加データ(賭け金の金額、入力された時間など)を持つ多対多の関係です
モデルの記述に関する優れたDjangoドキュメントのこれについてのシャパー。
タイラーはすでにこのための適切なスキーマを概説しています。