Vous n'êtes pas identifié(e).
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
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