Für die folgende Abfrage:
res = People.objects.all().exists()
Was genau macht Django mit einem MySQL-Backend? Ist es das Folgende:
cursor.execute("SELECT * FROM people")
results = cursor.fetchall()
if results:
res = True
else:
res = False
Oder wird etwas Optimierteres verwendet, z. B .:
cursor.execute("SELECT 1 FROM people")
if cursor.fetchone():
res = True
else:
res = False
Antworten:
3 für die Antwort № 1Django versucht immer zu optimieren exists()
Abfrage. Im Falle von mysql
es verwendet LIMIT 1
:
SELECT 1 FROM people LIMIT 1
Wie Daniel in den Kommentaren angemerkt hat, können Sie die zugrunde liegenden Abfragen von Django untersuchen, indem Sie sie anzeigen connection.queries
:
from django.db import connection
res = People.objects.all().exists()
print connection.queries
Weitere Informationen finden Sie unter Wie kann ich die rohen SQL-Abfragen sehen, die Django ausführt?
Zu Ihrer Information, has_results()
Methode in django.db.models.sql.Query
Klasse ist verantwortlich für die Konstruktion der exists()
Abfrage.