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 :

Quelque chose que je n'ai pas compris avec les modeles de données [Python 3.X]


Sujet :

Django Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut Quelque chose que je n'ai pas compris avec les modeles de données
    Bonjour à tout le monde

    je débute mon autoformation à Django avec une petite application nécessaire pour moi, la gestion de ma collection de pièces Euros...
    Non pas quelle soit fabuleuse, c'est juste un prétexte pour ne pas utiliser un tableur

    j initialise ma base de données de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Pays_Emetteur(models.Model):
        nom = models.CharField(max_length=30)
        nom_long = models.CharField(max_length=50)
        image_petit_drapeau = models.CharField(max_length=50)
        image_grand_drapeau = models.CharField(max_length=50)
     
     
    class Pieces_Commemoratives(models.Model):
        pays_emetteur = models.ForeignKey(Pays_Emetteur,on_delete=models.CASCADE)
        resume =models.CharField(max_length=100)
        image = models.CharField(max_length=50)
        description = models.CharField(max_length=500)
        graveur = models.CharField(max_length=50)
    J'ai un fichier texte pour les pays emeteurs que je parcous au moyens d'une boucle


    les donnees arrivent dans la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sqlite> select * from init_pays_emetteur;
    0|Allemagne|la République fédérale d'Allemagne||
    1|Autriche|la république d'Autriche||
    2|Belgique|le royaume de Belgique||
    3|Espagne|le royaume d'Espagne||
    4|Finlande|la république de Finlande||
    5|France|la République française ||
    .....
    Pour les pieces commemoratives, jutilise ensuite un fichier csv avec les infos suivantes que je le parcous au moyens d'une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Finlande   ;Élargissement de l'Union européenne à dix nouveaux États membres                           ;2 euros commémorative Finlande 2004.png;Cette pièce est la première pièce commémorative de 2 € émise par la Finlande. Le dessin représente un pilier stylisé dont les pousses tendent vers le haut. Les pousses représentent l'élargissement de l'Union européenne. Le pilier représente le fondement de la croissance. Les lettres EU apparaissent près du pilier, tandis que le millésime 2004 est inscrit dans la partie supérieure de la pièce, interrompant les douze étoiles du drapeau européen, placées sur l'anneau externe de la pièce.                                                                                                    ;Pertti Mäkinen                                    ;Edge finland s01.jpg                           ;Juin 2004     ;1000 000 
    Grèce      ;Jeux olympiques d'Athènes de 2004;                                                         ;2E 2004 Grece JO.png                   ;Cette pièce est la première pièce commémorative de 2 € émise par la Grèce et la toute première émise tous pays confondus. Le dessin d'une statue antique représentant un discobole sur le point de lancer le disque. Les cinq anneaux olympiques, au-dessus desquels on peut lire la légende en anglais ATHENS 2004 (Athènes 2004), sont représentés à gauche, tandis que le chiffre 2 et le mot ΕΥΡΩ (euro) se trouvent à droite. L'anneau externe de la pièce comporte les douze étoiles du drapeau européen, ainsi que le millésime entrecoupé par l'étoile la plus basse, de la manière suivante : 20*04.;Konstantinos Kazakos                              ;Edge greece s01.jpg                            ;Mars 2004     ;4000000
    ....
    Le parcours du fichier se fait bien. mon problème se situe au niveau de la relation entre la classe Pieces_Commemoratives et Pays_Emetteur pour l 'enregistrement des données de la table Pieces_Commemoratives, je ne comprends pas comment faire. Comment lui dire, pour telle piece, d'aller chercher l 'id du pays deja stocké dans la table Pays_Emetteur. J'ai essayé plein de choses, filter, etc...mais çà ne fonctionne pas

    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
    20
     
    Tab = Rempli_Tab_Pieces_2E_Comm("init/static/2004.txt")
        i = 0
        for ligne in Tab:
            print(ligne)
            ligne_de_travail = ligne.split(";")
            pays_emmeteur = ligne_de_travail[0]
            #p=Pays_Emetteur.objects.filter(nom=pays_emmeteur)
            #print(p)
            #print(type(p))
            resume = ligne_de_travail[1]
            image_recto = ligne_de_travail[2]
            piece = Pieces_Commemoratives(i)
            PAYS_EMETTEUR = Pays_Emetteur(nom=pays_emmeteur)
            #PAYS_EMETTEUR.save()
            piece.pays_emetteur = PAYS_EMETTEUR
            piece.resume = resume
            piece.image = image_recto
            piece.save()
            i += 1
    Si je laisse tel quel, j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValueError: save() prohibited to prevent data loss due to unsaved related object 'pays_emetteur'.
    si j’enlève le # devant #PAYS_EMETTEUR.save(), il me crée des doublons dans la table pays, et créé une relation entre les tables, mais ce n'est pas ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #table Pieces Commemoratives apres import fichier 2004.txt
    3|50e anniversaire du Programme alimentaire mondial                                          |2E 2004 Italie ProgAlimentaire.png     |||22 <==Je voudrais avoir 7 ici
    alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #table Pays_Emetteur apres import fichier 2004.txt
    7|Italie|la République italienne||  <== Issue de la premiere boucle, le parcours du fichier des pays
    ....
    22|Italie     |||  <==Issue de la deuxieme boucle, le parcours du fichier des pieces, je n'en VEUX PAS DE CETTE LIGNE
    J'espere que vous avez pu comprendre où se situe mon probleme, et d'avance, je vous remercie.
    Le code est pas terrible, je sais...
    Olivier

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonsoir,

    Le fait d'instancier Pays_Emetteur de cette manière, implique que vous ne sauvegardez pas l'objet dans la base. Et le problème se posera de la même manière pour Pieces_Commemoratives.

    Pour créer l'objet utilisez la requête Pays_Emetteur.objects.create(nom=pays_emetteur), puis de la même manière faîtes le pour Pieces_Commemoratives.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut Merci, mais...
    Bonsoir Fred1599

    merci pour votre réponse, mais je crois que ce n'est pas celle que j'attendais..

    La création des elements se fait bien, mais mal....

    comme je l ai dit plus haut, l initialisation de la table pays_emetteur se fait bien, j'ai une ligne par pays

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #table Pays_Emetteur apres import fichier 2004.txt
    7|Italie|la République italienne||  <== Issue de la première boucle, le parcours du fichier des pays
    Quand le fais l'import du fichier des pièces de 2004, j'ai cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #table Pieces Commemoratives apres import fichier 2004.txt
    3|50e anniversaire du Programme alimentaire mondial                                          |2E 2004 Italie ProgAlimentaire.png     |||22 <==Je voudrais avoir 7 ici, et pas 22
    ce qui est important dans le cadre juste au-dessus, c'est ce qui est en gras


    parce que maintenant, pour l Italie, j'ai 2 lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #table Pays_Emetteur après import fichier 2004.txt
    7|Italie|la République italienne||  <== Issue de la première boucle, le parcours du fichier des pays
    ....
    22|Italie     |||  <==Issue de la deuxième boucle, le parcours du fichier des pieces, je n'en VEUX PAS DE CETTE LIGNE
    je fais des dizaines de recherches Google en tentant de résoudre cela, à base objects.get ou object.filter mais sans succès..


    Voilà, j’espère avoir été plus clair...

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Moi ce que je vois c'est le message d'erreur, et donne une possible solution à ce problème.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Ah, visiblement, je n'arrive pas à me faire comprendre...
    Je vais essayer de m'expliquer autrement...
    J'ai deux tables SQL, une table pays_émetteur, et une table Pieces_Commemoratives

    En parcourant mon fichier de liste de pieces pour effectuer l import, sachant que l import des pays_emeteurs est déjà fait, comment faire pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    #C'est pas du vrai code, un melange de Python/SQL...
    #on est dans la boucle
    
    pays_emmeteur = ligne_de_travail[0]
    PAYS_EMETTEUR = resultat de (Select Pays_Emetteurs.id where Pays_Emetteurs.nom=pays_emmeteur)
    INSERT INTO Pieces_Commemoratives (pays_emetteur ,resume ,image ,description ,    graveur , etc) VALUES (%s,%s,%s,%s,%s)", (PAYS_EMETTEUR, resume, etc...)
    Comment je cherche un élément dans une table pour pouvoir insérer cette information dans une autre table?

    merci

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Dans votre select vous oubliez le plus important, c'est le mot clé FROM.

    En admettant que se soit Pays_Emetteur après FROM, il suffit dans ce cas de faire appel à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pays = Pays_Emetteur.objects.get(nom=pays_emetteur)
    print(pays.id)
    Après pour Pieces_commemoratives, tout dépend si les données sont déjà insérées dans la table ou non, mais j'utiliserai la méthode get_or_create.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Oui, il manque le FROM ...

    Alors, j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     pays_emmeteur = ligne_de_travail[0]
            print(pays_emmeteur)  #==> ca affiche Finlande, le 1er champs de la la 1ere ligne de mon fichier
            resume = ligne_de_travail[1]
            image_recto = ligne_de_travail[2]
            piece = Pieces_Commemoratives(i)
            PAYS_EMETTEUR = Pays_Emetteur.objects.get(nom=pays_emmeteur)
    et ça fonctionne !!! dans la boucle de lecture du fichier pieces, on est plus obligé de sauvegarder des pays en doublons...

    Je te remercie grandement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Qu'est-ce que je n'ai pas compris dans les threads ?
    Par Patrice Henrio dans le forum Concurrence et multi-thread
    Réponses: 25
    Dernier message: 27/01/2014, 11h56
  2. Réponses: 7
    Dernier message: 28/06/2012, 12h39
  3. Une chose que je ne comprend pas avec les editors/renderer
    Par Djobird dans le forum Composants
    Réponses: 6
    Dernier message: 30/03/2009, 10h24
  4. Quelques trucs que je ne comprends pas
    Par darkbob dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/10/2006, 10h15
  5. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01

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