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 :

Accéder à un champ d'une relation n*n


Sujet :

Django Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 72
    Points
    72
    Par défaut Accéder à un champ d'une relation n*n
    bonjour tout le monde,

    Tout d'abords, je vous donne mes models :
    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
    21
    22
    23
    24
     
    class Category(models.Model):
        name = models.CharField(max_length=32, unique=True)
     
        def __str__(self):
            return self.name
     
     
    class Student(models.Model):
        class Meta:
            ordering = ('last_name',)
     
        first_name = models.CharField(max_length=32)
        last_name = models.CharField(max_length=32)
        category = models.ManyToManyField(Category, through="CategoryStudent")
     
        def __str__(self):
            return f'{self.first_name} {self.last_name}'
     
     
    class CategoryStudent(models.Model):
        student = models.ForeignKey(Student, on_delete=models.CASCADE)
        category = models.ForeignKey(Category, on_delete=models.CASCADE)
        notes = models.PositiveIntegerField()

    J'ai un souci avec une requête dans la vue. Ce que je souhaiterai faire, c'est de récupérer si possible en une seule requête, la liste de tous les élèves qui ont une note dans le cours d'anglais.

    Comment puis je obtenir la valeur du champ "notes" ? Pour le moment, j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def temp(request):
        rows = Student.objects.filter(category__name="Anglais")
        print('>>>', rows) #j'obtiens bien quelque chose
        for row in rows:
            print('>>>> ', row.notes)
     
        return HttpResponse('yey')
    J'ai une belle erreur lorsque j'essaie d'accéder au champs notes. L'erreur est :
    AttributeError at /

    'Student' object has no attribute 'notes'
    Dans le template, est il possible aussi de récupérer cet attribut ? (Là, j'ai renvoyé une simple réponse http. Sinon, comment ça se passe ?)

    Par avance, je vous remercie infiniment de votre aide.
    prenez soin de vous et je vous souhaite une très belle journée

  2. #2
    Membre régulier
    Homme Profil pro
    growth hacker
    Inscrit en
    Novembre 2018
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : growth hacker
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2018
    Messages : 182
    Points : 116
    Points
    116
    Par défaut
    juste un conseil n'attend pas de repense car celui qui va essayer il va rester une heure à t'expliquer que tout ton code est faux mais voilà un exemple où sont les notes ils ne sont pas dans student mais CategoryStudent et il y a aucune relation entre les deux

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 72
    Points
    72
    Par défaut
    Mise à part un troll qui me raconte des inepties, est ce que quelqu'un peut m'aider svp ?

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

    notes ne fait pas partie des attributs du model Student, donc la manière dont est créé ta requête ne peut pas fonctionner.

    Par contre cet attribut se trouve dans dans le model CategoryStudent, c'est donc depuis lui qu'on pourra accéder à ce que l'on souhaite.

    Si je récupère tous les CategoryStudent dont la catégorie est l'anglais, j'aurais les student et les notes.
    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 régulier
    Homme Profil pro
    growth hacker
    Inscrit en
    Novembre 2018
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : growth hacker
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2018
    Messages : 182
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    notes ne fait pas partie des attributs du model Student, donc la manière dont est créé ta requête ne peut pas fonctionner.

    Par contre cet attribut se trouve dans dans le model CategoryStudent, c'est donc depuis lui qu'on pourra accéder à ce que l'on souhaite.

    Si je récupère tous les CategoryStudent dont la catégorie est l'anglais, j'aurais les student et les notes.
    c'est ce que je lui ai dit et ça c'est une petite partie des erreurs qu'il a fait tout son modèle et erroné alors ça ne peut pas marcher avec ce modèle il ne peut pas mettre à chaque étudient une note

  6. #6
    Membre régulier
    Homme Profil pro
    growth hacker
    Inscrit en
    Novembre 2018
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : growth hacker
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2018
    Messages : 182
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par niuxe Voir le message
    Mise à part un troll qui me raconte des inepties, est ce que quelqu'un peut m'aider svp ?
    malheureusement pour vous le supposé troll est le seul vrai développeur ici les autres sont tous des pseudos développeur qui savent seulement faire le minimum

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    notes ne fait pas partie des attributs du model Student, donc la manière dont est créé ta requête ne peut pas fonctionner.

    Par contre cet attribut se trouve dans dans le model CategoryStudent, c'est donc depuis lui qu'on pourra accéder à ce que l'on souhaite.

    Si je récupère tous les CategoryStudent dont la catégorie est l'anglais, j'aurais les student et les notes.
    Merci beaucoup Fred de me donner un coup de main. J'ai essayé ce que tu m'as dit. Et non, malheureusement, je ne récupère pas le first_name, ni le last_name. Bien sûr; j'ai les notes. Mais à quoi ça me sert ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         rows = CategoryStudent.objects.filter(category__name="Anglais")
        for row in rows:
            print('>>>> ', row.first_name)
            print('>>>> ', row.last_name)
    'CategoryStudent' object has no attribute 'first_name'
    Bien sûr et dans ce cas, je peux faire ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    rows = Student.objects.filter(category__name="Anglais")
    output = []
    for row in rows:
        output.append({
            'first_name' : row.first_name,
            'last_name' : row.last_name,
            'notes' : CategoryStudent.objects.filter(student__id=row.id),
        })
    context = {
        'students': output
    }
    return render(request, 'english_result.html', context)
    Mais c'est louche puisqu'avec une seule requete sql, je récupère tout .... Là, je fais une boucle pour récupérer ce dont j'ai besoin (voir plusieurs boucles si j'ai besoin de plusieurs éléments de la table category et ensuite dans le template, je refais les mêmes boucles. Or avec Django, on écrit une seule fois les choses.... Je me retrouve à peu près dans le même cas de figure que ma solution de vendredi : Strudent.objects.raw(sql). As tu une meilleur idée ?

    merci encore pour ce coup de pouce

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par niuxe Voir le message
    Merci beaucoup Fred de me donner un coup de main. J'ai essayé ce que tu m'as dit. Et non, malheureusement, je ne récupère pas le first_name, ni le last_name. Bien sûr; j'ai les notes. Mais à quoi ça me sert ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         rows = CategoryStudent.objects.filter(category__name="Anglais")
        for row in rows:
            print('>>>> ', row.first_name)
            print('>>>> ', row.last_name)
    On est tout bon, rows est une CS, tu ne choisis pas les noms de variable adaptés et tu t'y perds

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cs = CategoryStudent.objects.filter(category__name="Anglais")
    output = []
    for cat in cs:
        output.append({'first_name' : cat.student.first_name,
            'last_name' : cat.student.last_name,
            'notes' : cat.notes,
        })
    # suite du code...
    devrait donner quelque chose de plus correct si les models que tu présentes n'ont pas changés
    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)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 72
    Points
    72
    Par défaut
    Un énorme merci.


    Bah oui, que suis je bête. J'ai pas du tout pensé à renseigner l'attribut parent (student). Je ne m'embrouillais pas avec le nom des variables. row etant ligne de tableau en français. C'est une variable générique. Je n'ai pas encore l'aisance sur l'ORM de Django.

    Logiquement, on devrait pouvoir récupérer notes à partir de Student si on suit la même logique. Je vais regarder ça de plus près.

    En tout cas, encore un énorme merci. Tu m'as enlevé une épine du pied.

    Je te souhaite une très belle journée et une bonne semaine. Si tu passes sur Alsacreations, n'hésite pas à me faire signe.

    Bien à toi

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Cool, n'oublie pas le
    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)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/06/2008, 12h49
  2. Accèder à un champ depuis une fenetre modale
    Par shaun_the_sheep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/04/2008, 16h49
  3. Accéder aux champs d'une fenêtre d'un autre logiciel
    Par Melodie dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/03/2008, 09h15
  4. Accéder à un champ d'une requette sql
    Par mahboub dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/04/2007, 08h44
  5. [POO] accéder à un champ dans une bd
    Par Dsphinx dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2007, 16h46

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