IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

lien entre deux models


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 39
    Par défaut lien entre deux models
    Bonjour,

    Je débute avec Django, et je m'excuse si la question peut paraître stupide, mais j'ai cherché un moment sans trouver de solution...

    J'aimerais créer un second modèle qui se construit à partir des instances d'un premier. Les différentes liaisons proposées ne me semblent pas appropriées (ForeignKey, OnetoOne, ou ManytoMany) et je ne trouve pas de solution... Bien que ce soit sans doute une évidence pour qui s'y connaît un peu

    J'aimerais pouvoir créer différentes compétences pour la création d'un personnage, par exemple sous cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Compétence(models.Model):
        nom = models.CharField(max_length=30, default= '...')
        description = models.CharField(max_length=200, default='...')
        caractéristiques_liees = models.CharField(max_length=200)
     
        def __str__(self):
            return self.nom
    Et pouvoir réutiliser les instances de la class Compétence comme Attributs de la class Création de héros pour définir les valeurs à la création d'un personnage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Creation_Heros(models.Model):
        nom = models.CharField(max_length=30, default= '...')
        [itération des différentes compétences crées dans la class Compétence] = models.IntegerField()
     
        def __str__(self):
            return self.nom

    J'espère être assez clair

    Merci à ceux qui prennent le temps de me lire !

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Bonjour,

    Dans la logique, un héro peut avoir plusieurs compétences, je dirais donc que la conception serait du OneToMany, c'est à dire du ForeignKey.

    Tout le reste est à faire en suivant la documentation.

    Bonne continuation...

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 39
    Par défaut
    Bonjour,
    Merci pour ta réponse.
    Le problème c'est que je ne souhaite pas pouvoir creer ou modifier les attributs à partir de la cretion d'un héros, mais je souhaite uniquement recupérer les valeurs des attribut.nom de chaque instances de la classe attribut dans ma classe héros pour y ajouter une valeur .
    J'espère que je suis clair, je ne suis même pas sûr qu'une liaison soit la solution..

  4. #4
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Par défaut
    Bonjour,

    Je ne suis pas sure de comprendre votre classe Creation_Heros.

    Je comprendrais plutôt une classe Competence et une classe Heros (qui peut avoir une méthode creation).
    Dans ce contexte, je pense qu'il vous faudrait une table d'association définie manuellement. Vous pourrez la relier à la classe Heros par un ManyToMany utilisant l'option "through".
    Dans ce modèle d'association, vous pourrez rajouter un champ "points", "force", "valeur" ou ce que vous voulez d'autre qui caractérise le lien entre vos deux modèles.

    Je vous laisse approfondir cette option avec la documentation.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Citation Envoyé par Niko21 Voir le message
    Bonjour,
    Merci pour ta réponse.
    Le problème c'est que je ne souhaite pas pouvoir creer ou modifier les attributs à partir de la cretion d'un héros, mais je souhaite uniquement recupérer les valeurs des attribut.nom de chaque instances de la classe attribut dans ma classe héros pour y ajouter une valeur .
    J'espère que je suis clair, je ne suis même pas sûr qu'une liaison soit la solution..
    Bonjour,

    Ce que vous dîtes ne veut absolument rien dire, il vous manque des connaissances soit en Django, soit en POO, voir en conception UML.

    Bref, le sens logique serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Compétence(models.Model):    nom = models.CharField(max_length=30, default= '...')
        description = models.CharField(max_length=200, default='...')
        caractéristiques_liees = models.CharField(max_length=200)
        hero = models.ForeignKey(Hero, on_delete=models.CASCADE)
     
        def __str__(self):         
            return self.nom
    et la création d'une compétence se ferait de cette manière,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Competence.objects.create(
        nom='...',
        description='...',
        caracteristiques='...',
        hero=Batman
    )
     
    ou
     
    Batman.competence_set.create(
        # voir la suite comme plus haut
    )
    avec Batman créé de cette manière,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Batman = Hero.objects.create(nom='Batman')
    et avoir toutes les compétences de Batman,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Competence.objects.filter(hero__nom='Batman')
    Bref tout ça c'est dans les docs -> ICI

    J'ai dans mon exemple modifié Creation_Heros qui n'est pas un nom d'objet par Hero (au singulier)

    P.S1 On aurait même pu faire du ManyToMany, tout dépend de la conception.
    P.S2 On attaque pas un iceberg comme Django sans des connaissances préalables en POO et avec de très bonnes bases Python

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 39
    Par défaut
    Bonjour,

    J'ai pas été clair dans ce que je souhaite faire. Je souhaite pouvoir créer des héros avec des Attributs (donc rien à voir avec les attributs d'une classe!) et que pour chaque attribut celui-ci est une valeur.
    Exemple:
    héros : Polux:
    Coeur = 60
    Corps = 40
    Esprit = 70

    J'aurai aimé faire ça de façon à ce qu'une mise à jour de mon modèle Attribut modifie directement en conséquence le modèle Héros.

    @PetitChameau: Merci pour votre aide
    Alors j'ai essayé de la façon que vous proposez, j'ai pas obtenu le résultat souhaité, mais j'ai appris quelque chose, c'est toujours ça de pris!

    Voilà ce que j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Attribut(models.Model):
        nom = models.CharField(max_length=128)
        description = models.CharField(max_length=200, default='...')
        competences_liees = models.CharField(max_length=200, default='...')
     
        def __str__(self):
            return self.nom
     
    class Heros(models.Model):
        nom = models.CharField(max_length=128)
        attributs = models.ManyToManyField(Attribut, through='Valeur_Attribut')
     
        def __str__(self):
            return self.nom
     
    class Valeur_Attribut(models.Model):
        heros = models.ForeignKey(Heros, on_delete=models.CASCADE)
        attribut = models.ForeignKey(Attribut, on_delete=models.CASCADE)
        valeur = models.IntegerField()
    Le lien est bien fait entre les deux et je peux ajouter une valeur à mon attribut. Le problème c'est que, sauf erreur de ma part, je n'arrive pas à assigner l'ensemble des attributs à un héros. Ainsi je peux créer : Polux, Coeur = 60. C'est tout.

    @WebSmartCode: Merci, je sors justement du chapitre précédent! Que j'ai pas encore bien assimilé... Mais je vais aller y jeter un œil.


    @fred1599: Merci pour votre proposition
    Le problème c'est que je ne vois toujours pas comment je peux ajouter une valeur à chacun des attributs.


    Je pense que le plus simple sera finalement de faire 3 modèles distincts:
    - Heros: avec toutes les infos, dont les valeurs des attributs et des compétences exemple: coeur = models.Integerfield()...
    - Attribut: nom, description, competences_liees
    - Competence: nom, description, attribut_lie

    Et si je dois modifier/ajouter/supprimer une compétence, alors je mettrai aussi le modèle héros à jour.


    ps: fred1599 je suis parti de zéro il y a un an et ai appris en autodidacte avec le peu de temps que j'ai de disponible. La personne la plus qualifiée que je connaisse dans le domaine doit être mon cheval. Alors des erreurs j'en ai fait un paquet! Mais quand je fais un pas de trop en avant, je prends le temps de reculer de deux pour reprendre les bases. C'est ce que vais faire à nouveau. Mais j'ai appris beaucoup de choses depuis que j'ai commencé avec Django.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Je continue à dire que la solution proposée est la bonne,

    Le problème c'est que je ne vois toujours pas comment je peux ajouter une valeur à chacun des attributs.
    Vous ne voyez pas parce-que vous ne connaissez pas, il est donc temps de prendre le temps de lire la documentation Django...

    Quand on veut aller trop vite on passe à côté de plein de choses.

Discussions similaires

  1. [MySQL] Lien entre deux tables
    Par ept35 dans le forum PHP & Base de données
    Réponses: 27
    Dernier message: 14/12/2005, 19h42
  2. [MySQL] Lien entre deux tables
    Par ept35 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/11/2005, 13h56
  3. lien entre deux sous formulaire :(
    Par souska dans le forum Access
    Réponses: 4
    Dernier message: 20/09/2005, 21h37
  4. Type de lien entre deux associations
    Par thibal dans le forum PowerAMC
    Réponses: 2
    Dernier message: 17/06/2005, 16h53
  5. [VB.NET] ComboBox lien entre deux tables
    Par VDB1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/07/2004, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo