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 :

[DJANGO] Problème de QuerySet et object


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut [DJANGO] Problème de QuerySet et object
    Bonjour.

    En tant que débutant, je vous demande un peu de compréhension si ma question et mes erreurs sont simplistes...

    Je suis confronté à un problème. Je souhaiterai tester si un champs d'un models est Vrai ou Faux dans le views.py

    Voici les class concernés dans mon models.py:
    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
    class Communaute(models.Model):
        nom=models.CharField(max_length=50, verbose_name="Nom de la communauté", unique=True)   #nom de la communauté
        description=models.TextField(blank=True, verbose_name="Description")
        TYPE_COMMUNAUTE=(
            ('PUBLIQUE','Publique'),
            ('PRIVEE','Privée'),
        )
        type_communaute=models.CharField(max_length=50, verbose_name="Type de la communauté", choices=TYPE_COMMUNAUTE)
        inscriptionauto=models.BooleanField(default=False, verbose_name="Inscription automatique")
        membres=models.ManyToManyField(User, through='Rejoindre', verbose_name="Communaute", null=True, blank=True)
        def __unicode__(self):
            return self.nom
     
     
    class Rejoindre(models.Model):
        createur = models.BooleanField(default=False, verbose_name="Créateur de la communaute")
        date = models.DateTimeField(auto_now_add=True, auto_now=False,verbose_name="Rejoins depuis le:")
        user = models.ForeignKey(User)
        communaute=models.ForeignKey(Communaute)
        postuler=models.BooleanField(default=False, verbose_name="La personne a t'elle postulée")
        refuser=models.BooleanField(default=False, verbose_name="La personne est elle refusée")
        def __unicode__(self):
            return "Communauté: {0}".format(self.communaute.nom)
    Et voici mon fichier views.py (Attention, il n'est pas complet !)

    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
    25
    26
    27
    28
    def details_communaute(request, id):
     
        try:
            communaute=Communaute.objects.get(id=id)
        except Communaute.DoesNotExist:
            raise Http404
     
        messages=MessagePublic.objects.filter(communaute=communaute).order_by('-date')
     
     
        masquer=True
        inscrire=True
     
        if communaute.type_communaute=="PUBLIQUE":
            masquer=False
            for membre in communaute.membres.all():
                if membre==request.user:
                    inscrire=False
        else:
             for membre in communaute.membres.all():
                if membre==request.user:
                    rejoindre=Rejoindre.objects.filter(user=membre,communaute=communaute)
                    if rejoindre.refuser==True :
                        inscrire=False
                        masquer=True
                    else:
                        masquer=False
                        inscire=False
    J'ai donc le message d'erreur suivant:

    AttributeError at /communaute/num-4/
    'QuerySet' object has no attribute 'refuser'
    Request Method: GET
    Request URL: http://localhost:8000/communaute/num-4/
    Django Version: 1.5.4
    Exception Type: AttributeError
    Exception Value:
    'QuerySet' object has no attribute 'refuser'
    Python Version: 3.3.2

    Après plusieurs tentatives en bidouillant le code, je n'arrive pas à régler le problème.

    Ma question est donc plutôt simple, comment tester si le champs Rejoindre.refuser pour l'utilisateur connecté et la communauté sélectionnée est "vrai"?

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Bonjour,

    Rejoindre.objects.filter renvoie un QuerySet (grosso modo, une liste) et pas une instance de Rejoindre.

    Essayez de prendre le premier élément du QuerySet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rejoindre=Rejoindre.objects.filter(user=membre,communaute=communaute)[0]
        if rejoindre.refuser==True :
            inscrire=False
            masquer=True
    Remarque : appeler une classe de modèle en utilisant un verbe, c'est un peu bizarre. C'est plutôt un journal d'inscription non ? Si c'est le cas pourquoi ne pas l'appeler JournalInscription ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Merci pour cette solution, cela fonctionne parfaitement.
    Si mon champs JournalInscription.createur avait été en seconde position dans mon models, j'aurais du écrire cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rejoindre=Rejoindre.objects.filter(user=membre,communaute=communaute)[1]
        if rejoindre.refuser==True :
            inscrire=False
            masquer=True
    Comme tu le vois, j'ai renommé ma class "Rejoindre", j'ai des difficultés à trouver des nominatifs pour mes bases de données

    Merci encore pour ta réponse

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Bonjour,

    Je crois que vous n'avez pas compris. On attend de la méthode filter qu'elle renvoie plusieurs enregistrements (ou ligne si vous préférez). Elle renverra donc toujours une liste.

    Chaque enregistrement contient les champs définis dans votre modèle.

    Si vous voulez accéder au champ créateur du premier enregistrement renvoyé, vous pouvez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rejoindre.objects.filter(user=membre,communaute=communaute)[0].createur

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Bonjour.

    Il est vraie que je n'avais pas complètement compris le fonctionnement de filter, maintenant c'est beaucoup plus clair.

    Je te remercie de ta réponse.

    Cependant, sur un autre forum une personne m'a expliqué que cela était plus du bricolage... on m'a donné une autre méthode utilisant le get et cela fonctionne pour le moment. Je vais peut-être trouver un cas particulier qui va faire que j'aurais un bug...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rejoindre=Rejoindre.objects.get(user=membre,communaute=communaute)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par GrimaudClement Voir le message
    Cependant, sur un autre forum une personne m'a expliqué que cela était plus du bricolage...
    Et cette personne a raison car .filter dans ce cas "fonctionne" mais n'est pas cohérent avec ce que vous avez écrit par ailleurs.
    Rejoindre est associe a une "association" qui est une table dans laquelle les colonnes (communaute, membre) seront la clef qui identifie les entrées.
    Si c'est une "cle" - on dira "candidate" - il y aura 0 ou 1 enregistrement associes. Si c'est autre chose, il pourra y en avoir 0 ou N.
    Subtil ? En fait, ce sera le même select qui sera expédie a la BDD.
    Mais ça change tout cote API: le .get retourne quelque chose ou levera une exception alors que .filter pourra retourner une liste de... éventuellement vide.

    Le .get sera cohérent avec la nature de la table.
    Utiliser .filter "fonctionne" mais montre que vous n’êtes pas très clair...
    Normal: vous débutez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. problème avec la balise object sous IE6
    Par mh333 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 02/03/2009, 23h56
  2. Réponses: 0
    Dernier message: 20/01/2009, 14h57
  3. [Django] Problème avec syncdb
    Par Soran dans le forum Django
    Réponses: 3
    Dernier message: 30/08/2007, 09h33
  4. [HTML/Object] Problème superposition calques (tag <object
    Par busmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/11/2005, 11h02

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