concepção de estrutura modelo de Django
-
05-07-2019 - |
Pergunta
Eu estou tentando criar um modelo para uma aplicação que permite a 2 pessoas a apostar uns com os outros (eu sei, soa estúpido ...). O que eu estou querendo saber é sobre como conectar a aposta com os usuários. A estrutura é como este
|-------------| |----------|
| Bet | | User |
| BetUser1 | |----------|
| BetUser2 |
| Winner |
| ... |
|-------------|
Então temos 2 pessoas que aposta com o outro (ambos são Users
de Django sistema auth) e, em seguida, depois que um deles ganha, há um vencedor. Agora todos esses 3 campos são do tipo User
, mas:
- Devo fazer BetUser1 e BetUser2 campos separados, ou projetar alguma relação muitos-para-dois aqui? (Com muitos-para-dois sendo uma relação muitos-para-muitos e com alguma forma externa de garantir a não mais que 2
Users
pode ser atribuído a cada aposta? - vencedor só pode ser Utilizador 1 ou Utilizador 2, ninguém mais claro. Como devo criar neste campo, mais uma
ForeignKey(User)
, ou alguma outra coisa?
Apenas procurando algum novo ponto de vista, como parece que, nesse caso estúpido eu estou preso com o sistema de modelo Django.
Solução
Eu provavelmente adicionar um terceiro modelo para representar uma aposta específica que alguém tenha colocado, como é possível que mais de duas pessoas poderiam entrar em uma aposta. Seria algo parecido com isto:
USER WAGER BET
User (FK(User)) Description
Bet (FK(Bet)) Winner (FK (Wager), null=True)
Amount
Django gerará automaticamente user.wager_set
e bet.wager_set
com base nas chaves estrangeiras. Isso permite que você facilmente iterate e exibir as apostas para uma aposta, assim como as apostas de cada usuário. Você também pode adicionar uma restrição unique_together
em User
e Bet
na tabela de Wager modo que cada usuário só pode fazer uma aposta.
Quando a aposta é tudo feito, e um vencedor foi selecionado, você só conjunto bet.winner
.
No caso de você correr para ele, você pode ver um aviso sobre related_name
por ter ponto Bet
para Wager
e Wager
ponto para Bet
. Para corrigir, basta adicionar related_name=wagers
para Wager.bet
.
Outras dicas
O que você precisa é uma relação para-muitos-muitos com dados adicionais (por exemplo, a quantidade sobre a aposta, o tempo inserido, ...)
Há um chaper sobre isso nas excelentes docs Django sobre como escrever modelos.
Tyler já delineou o esquema adequado para isso.