Django-fr

Forum

#1 20-11-2012 16:03:48

torrak
Membre
Inscription : 31-08-2011
Messages : 47

QuerySet relation plusieurs à plusieurs

Bonjour,


J'ai un questionnement sur l'utilisation des méthodes select_related et prefetch_related que je n'arrive pas vraiment à utiliser.

Voici un cas concret que je n'arrive pas à résoudre avec les méthodes classiques:

voici le modèle:

class Membre(models.Model):
   user = models.ForeignKey(User, unique = True)

class MembreGroupe(models.Model):
   id_membre = models.ForeignKey(Membre)
   id_groupe = models.ForeignKey(Groupe)

class Groupe(models.Model):
   nom = models.CharField(max_length=80)

Le but  ici est d'accéder à la classe groupe dans une requête dans laquelle l'utilisateur est connecté, moi j'essaye de faire de différentes manières, qui ne marchent pas:

1)

Utilisateur = Membre.objects.get(user = request.user.id)
membregroupe = Utilisateur.membregroupe_set.all()
Groupes = Groupe.objects.filter(id = membregroupe.id_groupe)

2)

Utilisateur = Membre.objects.get(user = request.user.id)
membregroupe = Utilisateur.membregroupe_set.all()
Groupes = Groupe.objects.filter(pk__in = [x.id_groupe for x in membregroupe])

Mais je trouve cette manière de procéder assez fastidieuse.

si vous avez d'autres solution merci de les exposer

Dernière modification par torrak (21-11-2012 15:01:40)

Hors ligne

#2 22-11-2012 12:11:41

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : QuerySet relation plusieurs à plusieurs

Bonjour,

Je me réponds tout seul. En fait en allant voir dans la base de données, j'ai vu que Django m'a ajouter "_id" à la fin de mon champ "id_groupe". Donc le champ s'appelait en fait "id_groupe_id", et la requête suivante fonctionne bien :

Utilisateur = Membre.objects.get(user = request.user.id)
membregroupe = Utilisateur.membregroupe_set.all()
Groupes = Groupe.objects.filter(pk__in = [x.id_groupe_id for x in membregroupe])

Par contre pourquoi django renomme les champs de la sorte ? Et ma question sur les select_related tient toujours, est-ce que son utilisation peut réduire la taille ou le nombre de requêtes à la base ?

Je pense qu'un petit exemple à l'appui pourrait être intéressant...Avis aux courageux.

Merci

Hors ligne

Pied de page des forums