2009-06-24 6 views
1

J'ai 2 modèles -je utiliser ce modèle pour montrer l'avatar dans les commentaires.Django ORM: requête de deux modèles

django_comments:

user_id 
comment 
..... 

myapp_profile

user_id 
image_path 
...... 

En fait, je suis pour une requête brute avec cursor.execute(), pour obtenir ces données

------- ---------- ------- 
'user_id' 'image_path' 'comment' 
------- ---------- ------- 
    3  name.jpg  test 

mais je veux faire "façons django ORM"

Toute solution?

Merci

Répondre

5

Réfléchissez à ceci: Que vas-tu revenir? Ce ne serait pas un exemple de l'un ou l'autre modèle, n'est-ce pas?

Cependant, avec la nouvelle annoter() et F() caractéristiques, vous pourriez être en mesure de retirer quelque chose comme:

Comment.objects.all().annotate(image_path=F('user__profile__image_path')) 

Bien sûr, vous pouvez toujours juste:

Comment.objects.all().select_related() 

et obtenir image_path de x.user.get_profile() image_path

+0

Comment.objects.all() annoter (image_path = F ('user__profile__image_path')) Je semble une bonne solution, mais il y a un problema J'utilise django 1.0 - Comment.objects.all(). select_related() Le seul problème est que je veux faire une seule requête. Merci pour votre temps –

+0

@ger Ainsi, vos choix sont clairs: mettre à niveau vers le tronc Django pour l'ORM vous propose besoin, accepter plusieurs requêtes, ou utilisez SQL brut que vous êtes maintenant. –

+1

J'ai aussi besoin de cela (et select_related() ne fonctionnera pas car il s'agit d'une relation many2many, correctement filtrée sur une seule ligne). Ce qui précède ne fonctionne pas: l'objet 'F' n'a aucun attribut 'lookup'. – miracle2k

1

Vous êtes à la recherche de la fonction proposée dans un billet #14030, qui fera les travaux suivants:.

Comment.objects.all().annotate(image_path=F('user__profile__image_path')) 

Ce que je suis actuellement en utilisant:.

Comment.objects.all().extra(select={'image_path': 'profiletable.image_path'})  
Questions connexes