progettare la struttura del modello per django
-
05-07-2019 - |
Domanda
Sto cercando di progettare un modello per un'applicazione che consenta a 2 persone di scommettere tra loro (lo so, sembra stupido ...). Quello che mi chiedo è come collegare la scommessa con gli utenti. La struttura è così
|-------------| |----------|
| Bet | | User |
| BetUser1 | |----------|
| BetUser2 |
| Winner |
| ... |
|-------------|
Quindi abbiamo 2 persone che scommettono l'una con l'altra (entrambe sono Utenti
del sistema django auth) e poi, dopo che una di esse vince, c'è un vincitore. Ora tutti questi 3 campi sono di tipo User
, ma:
- Devo creare campi separati BetUser1 e BetUser2 o progettare qui una relazione molti-a-due? (con molti-a-due che sono molti-a-molti e con un modo esterno di garantire non più di 2
Utenti
possono essere assegnati a ciascuna scommessa? - il vincitore può essere solo l'utente 1 o l'utente 2, nessun altro ovviamente. Come devo creare questo campo, ancora un altro
ForeignKey (utente)
o qualcun altro?
Sto solo cercando un nuovo punto di vista, in quanto sembra che in un caso così stupido sono bloccato con il sistema modello django.
Soluzione
Probabilmente aggiungerei un terzo modello per rappresentare una scommessa specifica che qualcuno ha piazzato, poiché è concepibile che più di due persone possano entrare in una scommessa. Sarebbe simile a questo:
USER WAGER BET
User (FK(User)) Description
Bet (FK(Bet)) Winner (FK (Wager), null=True)
Amount
Django genererà automaticamente user.wager_set
e bet.wager_set
in base alle chiavi esterne. Ciò ti consente di iterare e visualizzare facilmente le scommesse per una scommessa, nonché le scommesse di ciascun utente. Puoi anche aggiungere un vincolo unique_together
su User
e Bet
nella tabella delle scommesse in modo che ogni utente possa effettuare una sola scommessa.
Al termine delle scommesse ed è stato selezionato un vincitore, è sufficiente impostare bet.winner
.
Nel caso in cui ti imbatti, potresti visualizzare un avviso su related_name
facendo Scommetti
puntare su Scommessa
e Scommessa
punta a Scommetti
. Per risolvere, aggiungi related_name = wagers
a Wager.bet
.
Altri suggerimenti
Ciò di cui hai bisogno è una relazione Molti-a-molti con dati extra (ad es. l'importo sulla scommessa, il tempo inserito, ...)
Esiste un chaper su questo negli eccellenti documenti di Django sulla scrittura di modelli.
Tyler ha già delineato lo schema corretto per questo.