2009-06-24 6 views
1

Ich habe 2 Modelle Ich benutze diese Modelle, um den Avatar in Kommentaren anzuzeigen.Django ORM: Abfrage von zwei Modellen

django_comments:

user_id 
comment 
..... 

myapp_profile

user_id 
image_path 
...... 

Eigentlich tut eine rohe Abfrage mit cursor.execute() ı'm, diese Daten zu erhalten

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

aber ich möchte tun in "django orm Weisen"

Irgendwelche Lösung?

Danke

Antwort

5

Denken Sie darüber nach: Was bekommen Sie zurück? Das wäre kein Beispiel für irgendein Modell, oder?

jedoch mit der neueren annotate() und F() -Funktionen, können Sie in der Lage sein, so etwas wie ziehen aus:

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

Natürlich könnte man immer nur:

Comment.objects.all().select_related() 

und erhalten image_path von x.user.get_profile(). image_path

+0

Comment.objects.all() mit Anmerkungen versehen (image_path = F ('user__profile__image_path')) ich eine gute Lösung scheint, aber es ist ein problema Ich verwende django 1.0 - Comment.objects.all(). select_related() Das einzige Problem ist, dass ich nur eine Abfrage durchführen möchte. Vielen Dank für Ihre Zeit –

+0

@ger So Ihre Entscheidungen sind klar: Upgrade auf Django Trunk für die ORM-Funktionen, die Sie benötigen, akzeptieren mehrere Abfragen oder verwenden Raw SQL wie Sie jetzt sind. –

+1

Ich brauche das auch (und select_related() wird nicht funktionieren, da dies eine many2many-Beziehung ist, die richtig auf eine einzelne Zeile gefiltert ist). Das obige funktioniert nicht: 'F' Objekt hat kein Attribut 'Lookup'. – miracle2k

1

Sie suchen nach der Funktion, die in Ticket #14030 vorgeschlagen wird, die die folgende Arbeit machen wird:

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

Was ich derzeit benutze.

Comment.objects.all().extra(select={'image_path': 'profiletable.image_path'})  
Verwandte Themen