2016-04-02 10 views
4

meine Modelle sind wie soWie funktioniert die Django-Abfrage?

class Warehouse: 
    name = ... 
    sublocation = FK(Sublocation) 

class Sublocation: 
    name = ... 
    city = FK(City) 

class City: 
    name = .. 
    state = Fk(State) 

Jetzt entwickelt, wenn ich eine Abfrage zu werfen.

wh = Warehouse.objects.value_list(['name', 'sublocation__name', 
    'sublocation__city__name']).first() 

gibt es korrektes Ergebnis zurück, aber intern, wie viele Abfrage wirft es? holt django die Daten in einer Anfrage ab?

Antwort

5

Django erstellt nur eine Abfrage an die Datenbank, um die von Ihnen beschriebenen Daten abzurufen. Wenn Sie das tun:

wh = Warehouse.objects.values_list(
    'name', 'sublocation__name', 'sublocation__city__name').first() 

Es übersetzt in dieser Abfrage:

SELECT "myapp_warehouse"."name", "myapp_sublocation"."name", "myapp_city"."name" 
FROM "myapp_warehouse" INNER JOIN "myapp_sublocation" 
ON ("myapp_warehouse"."sublocation_id" = "myapp_sublocation"."id") 
INNER JOIN "myapp_city" ON ("myapp_sublocation"."city_id" = "myapp_city"."id")' 

es das Ergebnis in einer einzigen Abfrage erhält. Sie können wie diese Anzahl von Abfragen in Ihrer Shell zählen:

from django.db import connection as c, reset_queries as rq 

In [42]: rq() 

In [43]: len(c.queries) 
Out[43]: 0 

In [44]: wh = Warehouse.objects.values_list('name', 'sublocation__name', 'sublocation__city__name').first() 

In [45]: len(c.queries) 
Out[45]: 1 
+1

db jetzt bin ich Gonna verbringen Stunden meine Fragen alle wie diese durch die Prüfung – Crazyshezy

+1

Wenn Ihre Objekte auf einer HTML-Seite gerendert werden, können Sie stattdessen django-debug-toolbar verwenden. Es wird das für dich tun :) – v1k45

2

Mein Vorschlag würde sein, einen Test dafür zu schreiben, assertNumQueries (docs here) verwendend.

FYI Ich bin mir nicht sicher, wie viele Abfragen tatsächlich an die Datenbank gesendet werden, 1 ist meine derzeitige beste Schätzung. Passen Sie die Anzahl der erwarteten Abfragen an, um dies in Ihrem Projekt zu erreichen, und fixieren Sie die Anforderung.

0

In Django docs: QuerySet API Reference gibt es ausführliche Dokumentation darüber, wie und wann die Abfragegruppen ausgewertet werden.

Der ziemlich übliche Weg, um einen guten Einblick zu erhalten, wie viele und welche Abfragen während eines Seitenrenderings stattfinden, ist die Verwendung der Django Debug Toolbar. Dies könnte Ihnen genau sagen, wie oft dieses Recordset ausgewertet wird.

-1

Sie können django-Debug-Symbolleiste verwenden, um echte Abfragen zu sehen