Django : relations entre 3 modèles
Bonsoir,
Un cas qui pourrait s'appliquer pour différentes apps.
Pour mon cas j'ai une Histoire. Dans une Histoire j'ai des branches. Dans une branche je peux avoir des choix.
Dans Branch j'ai une ForeignKey Story.
Dans Branch j'ai mis un ManytoMany vers Choice.
-
Mais je me demande si je ne devrais pas mettre un champ ForeignKey Branch dans Choice plutot... et supprimer le ManytoMany Choice qui est dans Branch
-
Si dans Choice j'ai une Foreign vers Branch, est-ce que ça vaudrait le coup de faire une autre Foreign vers Story ? Sachant que dans Branch j'ai déjà une Foreign vers Story.
Actuellement
Modèles :
-
Story
-
Branch champ ForeignKey Story, champ ManytoMany Choices
-
Choice champ ForeignKey Story
Ce que je pense faire :
Modèles :
-
Story
-
Branch champ ForeignKey Story
-
Choice champ ForeignKey Branch, mais ajouter un champ ForeignKey Story en plus (pour mois non) ? Je ne pense pas car je peux passer par la branch pour récupérer la story
j'avoue que ma question est géniale pour embrouiller les esprits. .. lol
Après la réponse c'est peut-être tout simplement que le choix m'appartient en fonction de m'organisation. Mais je préfère avoir un avis ^^
Merci d'avance
Salut Gab !
Ça dépend pas mal de la logique que tu souhaite implémenter et de la manière dont tu vas récupérer les données.
Une ForeignKey est utilisée pour une relation "un-à-plusieurs". Si chaque choix appartient à une seule branche, un champ ForeignKey dans Choice pointant vers Branch est approprié 👍
Un champ ManyToManyField est utilisé pour une relation "plusieurs-à-plusieurs". Si un choix peut appartenir à plusieurs branches, un champ ManyToManyField dans Branch vers Choice est approprié 👍
Si tu as une ForeignKey de Choice à Branch, et de Branch à Story, tu peux accéder à l'histoire à partir d'un choix en chaînant les relations (par exemple, choice.branch.story). Du coup si tu ajoutes une ForeignKey directe de Choice à Story c'est redondant.
Donc pour résumer, si chaque Choice est spécifique à une Branch, et chaque Branch appartient à une Story, alors ça me semble logique d'avoir :
-
Une ForeignKey de
ChoiceàBranch. -
Une ForeignKey de
BranchàStory. -
Aucune ForeignKey directe de
ChoiceàStory, puisque tu peux accéder àStoryviaBranch.
Re !
J'ai un nouveau cas intéressant je pense.
Je suis sur une app de gestion des stocks. Et là c'est pareil j'ai des modèles avec plusieurs relations.
J'ai mon idée mais ça aurait été sympa d'avoir un avis.
En général je n'ai plus de problème avec la modélisation de ma BDD et les relations, mais là j'ai un petit doute sur ma façon de faire.
class Product(models.Model): # Produit
class VAT(models.TextChoices):
REDUCED = "5.5", _("Réduit 5.5%")
INTERMEDIATE = "10", _("Intermédiaire 10%")
NORMAL = "20", _("Normal 20%")
name = models.CharField(max_length=200, verbose_name="Nom")
slug = models.SlugField(blank=True)
ean = models.CharField(max_length=13)
package = models.IntegerField(verbose_name="Colis")
selling_price = models.FloatField(verbose_name="Prix de vente")
purchase_price = models.FloatField(verbose_name="Prix d'achat")
VAT = models.CharField(max_length=3, choices=VAT)
stock = models.FloatField(default=0)
company = models.ForeignKey(to=Company, on_delete=models.CASCADE,
verbose_name="Entreprise")
class Receipt(models.Model): # Entrée de marchandise
company = models.ForeignKey(to=Company, on_delete=models.CASCADE, verbose_name="Utilisateur")
date = models.DateField()
identification = models.IntegerField(unique=True)
class ProductReceipt(models.Model): # Les marchandises qui seront dans l'entrée
receipt = models.ForeignKey(to="Receipt", on_delete=models.CASCADE, verbose_name="Entrée")
product = models.ForeignKey(to="Product", on_delete=models.PROTECT, verbose_name="Article")
purchase_price = models.FloatField(verbose_name="Prix d'achat")
quantity = models.FloatField(verbose_name="Quantité")
On pourrait se dire que company est redondant. Car on l'a dans Product et Receipt. Alors que dans ProductReceipt on retrouve Receipt et Product...
Dans l'application chaque entreprise n'a accès qu'à ses Product. Et surtout, dans une Receipt, il ne peut y avoir des produits que d'une même entreprise.
Dans Receipt je laisse Company en ForeignKey ? Car je peux y accéder par une instance de ProductReceipt avec le champ product. Ou ça serait quand même logique d'avoir company dans Receipt ?
Car il faut savoir que l'on peut créer une Receipt (entrée) vide, sans marchandise dedans, dans l'attente de rentrer les marchandises plus tard. (et donc on ne sait pas à qui elle appartient cette entrée dans la BDD)
Je ne sais pas si je suis clair ^^ lol.
Habituellement j'évite la redondance, mais je pense que dans ce cas avoir Company à la fois dans Product et Receipt ça serait peut-être pas mal.
J'ai un doute !
Merci d'avance
PS : et je me dis qu'au niveau de la recherche, même si j'ai un champ company sur le Product, avoir un champ Company sur Receipt c'est peut être plus simple sur les recherches pour récupérer toutes les entrées d'un utilisateur.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte