2017-10-20 2 views
1

Ich arbeite an einer Django-Webanwendung und bin dabei, die Anzahl der einzelnen Datenbanktreffer zu minimieren, indem ich die Methoden prefetch_related und select_related verwende, ich habe eine bestimmte Methode in meinem User Modell, das zieht ein paar verschiedene verwandte Objekte daraus.prefetch_related für Authentifizierter Benutzer

Und dann benutze ich diese Methode in meinem view.

def profile(request): 
    profile_info = request.user.get_profile_info() 
    *rest of the view* 

Das Problem ist, da request.user nicht von den normalen Abfragemethoden abgerufen, bekomme ich nicht die prefetch_related und select_related zusammen mit Ziehen des Benutzers zu verwenden, und ich kann das keine Möglichkeit finden, abrufen verwandte Daten zusammen mit dem Modell dieses Benutzers.

Gibt es eine Möglichkeit zu sagen, überschreiben das Abrufen des Benutzermodells, so dass ich die Methoden prefetch_related und select_related ausführen können?

+0

'Das Problem ist, da request.user nicht von den normalen Abfrage-Methoden abgerufen wird,' können Sie dies bitte erklären? –

+0

Normalerweise ein django Modell abzurufen, erstellen Sie eine Abfrage wie: Model.objects.get (* Abfrage *) Und für die request.user, es wird einfach das Modell Benutzer, wenn Sie request.user in der Ansicht aufrufen. Und die 'prefetch_related' und' select_related' sind in den .objects-Methoden der Modelle verwendbar. – YoungVenus

Antwort

1

Sie können den Benutzer immer aus der Datenbank abrufen, indem Sie select_related und prefetch_related verwenden. Wenn und prefetch_related viele Abfragen speichern, dann ist es die zusätzliche Abfrage wert, den Benutzer abzurufen.

def profile(request): 
    user = User.objects.select_related(
     ... 
    ).prefetch_related(
     ... 
    ).get(pk=request.user.pk) 

Beachten Sie, dass sich je nach Ansicht, prefetch_related nicht sehr nützlich in diesem Fall sein könnte. Es verursacht eine zusätzliche Abfrage pro Modell, daher ist es am nützlichsten, wenn Sie die zugehörigen Objekte für ein gesamtes Abfrage-Set und nicht für ein einzelnes Objekt abrufen.

+0

Das habe ich in Erwägung gezogen, aber es fühlte sich einfach falsch an und ich hatte das Gefühl, dass es einen effizienteren Weg geben würde :( – YoungVenus

Verwandte Themen