Ich habe zwei Tabellen, eine "Firma" und eine "Angestellte":
%Vor% Und ich möchte jeden Angestellten in einer Tabelle auflisten, mit der Firma daneben. Was einfach genug ist, indem Sie employees = Employee.objects.all()
und in der Template-Schleife durch den Aufruf aufrufen und {{employee.company.name}}
aufrufen.
Das Problem mit diesen Lösungen besteht darin, dass für jedes Element in der Schleife eine neue Abfrage erstellt wird. Für jeden Mitarbeiter gibt es also eine Anfrage an das Unternehmen, etwa so:
%Vor%Stattdessen möchte ich diesen Beitritt zunächst in derselben Abfrage machen, um die Mitarbeiter zu bekommen. Etwas wie das:
%Vor%Ist das mit dem Django QuerySet möglich? Wenn nicht, gibt es einen Weg, um dieses Problem zu lösen (ohne rohe SQL)? Oder sollte dieses Verhalten ignoriert, zwischengespeichert und als "optimiert" betrachtet werden?
Mit select_related()
werden die entsprechenden Attribute vorab ausgefüllt:
Ich denke, Sie suchen nach der select_related-Methode Ihres Abfrage-Sets. Siehe das Dokument
select_related ()
Gibt ein QuerySet zurück, das folgt automatisch dem Fremdschlüssel Beziehungen, wählen Sie das aus zusätzliche verwandte Objektdaten, wenn es führt seine Abfrage aus. Das ist ein Leistungsverstärker, der resultiert (manchmal viel) größere Abfragen aber bedeutet spätere Verwendung des Fremdschlüssels Beziehungen benötigen keine Datenbank Abfragen
Es ist eine alte Frage, lassen Sie mich eine neue Antwort geben.
Tatsächlich können Sie das tun:
%Vor%Dann sucht Django automatisch nach der Unternehmensklasse und findet den Firmennamen für Sie.
auf der Vorlagenseite, verwenden Sie {{employee.company__name}}, dann wird der Firmenname korrekt angezeigt.
Tags und Links python django join django-queryset