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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top