Diseñando la estructura del modelo para Django.
-
05-07-2019 - |
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.
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.