conception de la structure du modèle pour django
-
05-07-2019 - |
Question
J'essaie de concevoir un modèle pour une application permettant à deux personnes de parier entre elles (je sais, ça semble stupide ...). Ce que je me demande, c'est comment connecter le pari avec les utilisateurs. La structure est comme ça
|-------------| |----------|
| Bet | | User |
| BetUser1 | |----------|
| BetUser2 |
| Winner |
| ... |
|-------------|
Nous avons donc 2 personnes qui ont misé l'une avec l'autre (les deux sont des utilisateurs
du système django auth), puis, lorsque l'un d'eux gagne, il y a un gagnant. Maintenant, tous ces 3 champs sont de type Utilisateur
, mais:
- Dois-je créer des champs distincts pour BetUser1 et BetUser2 ou définir une relation plusieurs à deux ici? (avec plusieurs-à-deux étant plusieurs-à-plusieurs et avec un moyen externe de s'assurer qu'il ne reste plus que 2
Utilisateurs
pouvant être affectés à chaque pari? - gagnant ne peut être que l'utilisateur 1 ou l'utilisateur 2, personne d'autre bien sûr. Comment dois-je créer ce champ, encore un autre
ForeignKey (Utilisateur)
, ou un autre?
Je cherche juste un nouveau point de vue, car il semble que dans un cas aussi stupide, je suis coincé dans le système de modèles django.
La solution
J'ajouterais probablement un troisième modèle pour représenter un pari spécifique qu'une personne a placé, car il est concevable que plus de deux personnes puissent entrer dans un pari. Cela ressemblerait à quelque chose comme ça:
USER WAGER BET
User (FK(User)) Description
Bet (FK(Bet)) Winner (FK (Wager), null=True)
Amount
Django générera automatiquement user.wager_set
et bet.wager_set
en fonction des clés étrangères. Cela vous permet de facilement parcourir et afficher les paris d'un pari, ainsi que les paris de chaque utilisateur. Vous pouvez également ajouter une contrainte unique_together
sur Utilisateur
et Parier
dans la table Wager afin que chaque utilisateur ne puisse faire qu'un seul pari.
Lorsque le pari est terminé et qu'un gagnant est sélectionné, il vous suffit de définir bet.winner
.
Au cas où vous l'auriez rencontré, vous pourriez recevoir un avertissement sur nom_relié
en faisant en sorte que Pari
pointe sur Wager
et Wager <. / code> pointez sur
Parier
. Pour résoudre ce problème, ajoutez simplement related_name = wagers
à Wager.bet
.
Autres conseils
Ce dont vous avez besoin, c’est d’une relation plusieurs à plusieurs avec des données supplémentaires (par exemple, le montant du pari, le temps saisi, ...)
Il y a un chaper dans les excellents documents Django sur l’écriture de modèles.
Tyler a déjà défini le schéma approprié pour cela.