Antworten:
Jedes QuerySet-Objekt verfügt über ein query
Attribut, das Sie zu Debugging-Zwecken in stdout protokollieren oder drucken können.
qs = Model.objects.filter(name='test')
print qs.query
Bearbeiten
Ich habe auch benutzerdefinierte Vorlagen-Tags (wie in diesem Snippet beschrieben ) verwendet, um die Abfragen im Rahmen einer einzelnen Anforderung als HTML-Kommentare einzufügen.
prefetch_related
dh 2 Abfragen anzeigen? Ich sehe nur 1.
<django.db.models.sql.query.Query object
Sie können auch die Python-Protokollierung verwenden, um alle von Django generierten Abfragen zu protokollieren. Fügen Sie dies einfach Ihrer Einstellungsdatei hinzu.
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# django also has database level logging
},
},
}
Eine andere Methode für den Fall, dass die Anwendung eine HTML-Ausgabe generiert - die Django-Debug-Symbolleiste kann verwendet werden.
'level': 'DEBUG'
unter 'django.db'
.
Solange eingeschaltet DEBUG
ist:
from django.db import connection
print(connection.queries)
Für eine einzelne Abfrage haben Sie folgende Möglichkeiten:
print(Model.objects.filter(name='test').query)
query
Rendite Query
Objekt seit Djagno 1.2 , die es nicht haben as_sql
Attribut.
Vielleicht sollten Sie sich die django-debug-toolbar
Anwendung ansehen , sie protokolliert alle Abfragen für Sie, zeigt Profilinformationen für sie an und vieles mehr.
Wenn Sie Datenbankrouting verwenden, haben Sie wahrscheinlich mehr als eine Datenbankverbindung. Mit diesem Code können Sie Verbindungen in einer Sitzung anzeigen. Sie können die Statistiken wie bei einer einzelnen Verbindung zurücksetzen:reset_queries()
from django.db import connections,connection,reset_queries
...
reset_queries() # resets data collection, call whenever it makes sense
...
def query_all():
for c in connections.all():
print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
# and if you just want to count the number of queries
def query_count_all()->int:
return sum(len(c.queries) for c in connections.all() )
Sie können eine Django debug_toolbar verwenden, um die SQL-Abfrage anzuzeigen. Schritt-für-Schritt-Anleitung zur Verwendung von debug_toolbar:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py => Neue Liste am Ende der Datei settings.py erstellen und folgende Liste hinzufügen:
INTERNAL_IPS= [127.0.0.1']
Dadurch kann das Debug nur auf dem internen Entwicklungsserver ausgeführt werden
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
Auf Ihrer Webseite wird unter 127.0.0.1 ein Add-On angezeigt. Wenn Sie auf das Kontrollkästchen SQL-Abfrage klicken, wird auch die Laufzeit der Abfrage angezeigt.