2009-03-04 12 views
2

Ich arbeite mit django und eine harte Zeit zu erfassen, wie komplexe Abfragen zu tundjango innerer Join-Abfrage

Hier ist mein Modell

class TankJournal(models.Model): 
    user = models.ForeignKey(User) 
    tank = models.ForeignKey(TankProfile) 
    ts = models.DateTimeField(auto_now=True) 
    title = models.CharField(max_length=50) 
    body = models.TextField() 

    class Meta: 
     ordering = ('-ts',) 
     get_latest_by = 'ts' 

Ich brauche die Benutzername des Tank Objekt gegeben zu ziehen.

Das Benutzerobjekt ist das in django eingebaute .. danke!

EDIT:

ich diese

print User.objects.filter(tankjournal__tank__exact=id) 

Es scheint nicht herausziehen nur die ID .. und ziehen Sie alles in tankjournal und passen es an den Tank Objekt

Antwort

6
versucht haben

Wenn Sie haben bereits Ihr Tank Objekt sollten Sie tun können:

tank.user.username 

Um die Datenbankabfragen zu reduzieren, sollten Sie die Verwendung von select_related(), z.

tanks = TankJournal.objects.all().select_related() 
for tank in tanks: 
    username = tank.user.username 

, wenn Sie eine bestimmte Tank-ID dann:

tank = TankJournal.objects.select_related().get(id=123456) 
username = tank.user.username 
1

ich Ihre Frage sein Unverständnis, aber ein Antrag auf User.objects.filter() wird eine Liste von Benutzerobjekten zurückgeben, nicht-Benutzer-IDs. Was du geschrieben hast, sieht technisch korrekt aus.

Denken Sie daran, dass das Modell, das Sie haben, eine Eins-zu-viele-Verbindung zwischen dem TankProfile-Objekt und dem TankJournal herstellt. Mit anderen Worten, ein einzelnes TankProfile kann mit mehr als einem TankJournal und daher mit mehr als einem Benutzer verknüpft werden. Wenn Sie dies tun, macht die Abfrage das Richtige und gibt mehr als einen Benutzer zurück.

+0

Jeder Benutzer kann mehrere Tanks haben .. und jeder Tank kann mehrere Journaleinträge haben .. ist der richtige Weg, um das Benutzerobjekt aus dem TankJournal Modell zu entfernen oder? – Mike

+0

Wenn jeder Tank mehrere Journaleinträge haben kann, kann jeder Tank auch (möglicherweise) mehrere Benutzer haben. Wenn Sie es auf einen einzelnen Benutzer eingrenzen möchten, benötigen Sie einen anderen Parameter. Ob Sie vom TankJournal oder vom Benutzer starten, hängt wahrscheinlich davon ab, was dieser Parameter ist. –