Pregunta

Estoy intentando diseñar un modelo para una aplicación que permita a 2 personas apostar entre sí (lo sé, suena estúpido ...). Lo que me pregunto es cómo conectar la apuesta con los usuarios. La estructura es como esta

|-------------|       |----------|
|    Bet      |       | User     |
| BetUser1    |       |----------|
| BetUser2    |
| Winner      |
| ...         |
|-------------|

Entonces, tenemos 2 personas que apuestan entre sí (ambos son Users del sistema django auth) y luego, después de que uno de ellos gana, hay un ganador. Ahora todos esos 3 campos son de tipo Usuario , pero:

  • ¿Debo hacer que BetUser1 y BetUser2 separen los campos, o diseñar algunas relaciones de muchos a dos aquí? (¿muchos a dos son muchos a muchos y con alguna forma externa de garantizar que no se pueden asignar más de 2 Usuarios a cada apuesta?
  • el ganador solo puede ser usuario 1 o usuario 2, nadie más, por supuesto. ¿Cómo debo crear este campo, otro ForeignKey (User) , o algún otro?

Solo estoy buscando un nuevo punto de vista, ya que parece que en un caso tan estúpido estoy atascado con el sistema modelo django.

¿Fue útil?

Solución

Probablemente agregaría un tercer modelo para representar una apuesta específica que alguien haya realizado, ya que es posible que más de dos personas puedan participar en una apuesta. Se vería algo como esto:

USER        WAGER              BET
             User (FK(User))    Description
             Bet  (FK(Bet))     Winner (FK (Wager), null=True)
             Amount

Django generará automáticamente user.wager_set y bet.wager_set en función de las claves externas. Esto le permite iterar y mostrar fácilmente las apuestas para una apuesta, así como las apuestas de cada usuario. También puede agregar una restricción unique_together en User y Bet en la tabla de apuestas para que cada usuario solo pueda hacer una apuesta.

Cuando todas las apuestas estén listas y se haya seleccionado un ganador, simplemente configuras bet.winner .

En caso de que te encuentres con él, puedes ver una advertencia sobre related_name al tener Bet punto a Wager y Wager apunta a Bet . Para solucionarlo, solo agregue related_name = wagers a Wager.bet .

Otros consejos

Lo que necesita es una relación de muchos a muchos con datos adicionales (por ejemplo, el monto de la apuesta, el tiempo ingresado, ...)

Hay un chaper sobre esto en los excelentes documentos de Django sobre modelos de escritura.

Tyler ya ha descrito el esquema adecuado para esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top