2017-02-07 1 views
2

Ich lese in der Django-Dokumentation, dass Django-Abfragen im Prinzip faul sind, dh die Datenbank wird erst dann abgefragt, wenn es unbedingt notwendig ist.Django Queries und Joins

nun als eine Frage der Effizienz, wenn ich retreive Daten über

FooModel.object.filter(...) 

und ich habe eine Beziehung zwischen FooModel und BarModel definiert, ist die Info von BarModel automatisch auch retreived? Oder geschieht dies nur, wenn ich später auf eines der BarModel-Felder referenziere?

Auf eine verwandte Anmerkung. Ich habe nach einem einfachen Weg gesucht, um das irgendwie selbst zu bestätigen, indem ich mir Logs anschaue oder einen Debugger benutze, aber nicht konnte. Ich wäre an Tipps interessiert, wie das geht.

+0

Siehe http://stackoverflow.com/questions/1085378/lazy-loading-relationships-in-django-and-other-mvcs-orms –

+4

zu sehen, welche Abfragen ausgeführt werden, Sie django-Debug-Toolbar verwenden können –

Antwort

3

BarModel wird nicht automatisch abgerufen, auch wenn Sie nach dem BarModel-Feld innerhalb des Objektfilters filtern, würde es nur beitreten und es als Parameter verwenden.

Wenn Sie daran interessiert sind, was query Django läuft man so etwas wie folgt

foo = FooModel.object.filter(...) 
print(foo.query) 

Um zusätzliche Tabellen in django verwenden könnten Sie select_related

0

Django Abfragen verwenden sollten und schließt sich faul sind, wie erwähnt. Das bedeutet, dass Django in Ihrem Fall nicht mit der Child-Tabelle verbunden wird, wenn der Filter nicht in die Child-Tabelle schaut. Es ruft auch keine Daten für das untergeordnete Objekt ab, wenn Sie nicht über Code darauf zugreifen.

Sie können dies mit dem MySQL general query log

0

Vom docs für Ihren speziellen Fall überprüfen:

Im Allgemeinen sind die Ergebnisse einer QuerySet sind nicht abgerufen aus der Datenbank , bis Sie „bitten“ für sie

Also, bis Sie explizit nach den Ergebnisdaten fragen (dh beim Iterieren), werden Sie nicht die Datenbank treffen.

Verwenden filter(..) bedeutet nur Hinzufügen von Clauses zu der SQL-Abfrage. Zum Beispiel, wenn Sie tun, wird nur WHERE id=2 in der SQL-Abfrage hinzufügen.