Câu trả lời:
Mỗi đối tượng Queryset có một query
thuộc tính mà bạn có thể đăng nhập hoặc in ra thiết bị xuất chuẩn cho mục đích gỡ lỗi.
qs = Model.objects.filter(name='test')
print qs.query
Biên tập
Tôi cũng đã sử dụng các thẻ mẫu tùy chỉnh (như được nêu trong đoạn trích này ) để đưa ra các truy vấn trong phạm vi của một yêu cầu dưới dạng nhận xét HTML.
prefetch_related
tức là hiển thị 2 truy vấn không? Tôi chỉ thấy 1.
<django.db.models.sql.query.Query object
Bạn cũng có thể sử dụng đăng nhập python để ghi nhật ký tất cả các truy vấn được tạo bởi Django. Chỉ cần thêm nó vào tập tin cài đặt của bạn.
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
},
},
}
Một phương pháp khác trong trường hợp ứng dụng đang tạo đầu ra html - thanh công cụ gỡ lỗi django có thể được sử dụng.
'level': 'DEBUG'
vào 'django.db'
.
Miễn DEBUG
là trên:
from django.db import connection
print(connection.queries)
Đối với một truy vấn cá nhân, bạn có thể làm:
print(Model.objects.filter(name='test').query)
query
trả về Query
đối tượng kể từ Djagno 1.2 không có as_sql
thuộc tính.
Có lẽ bạn nên xem qua django-debug-toolbar
ứng dụng, nó sẽ ghi lại tất cả các truy vấn cho bạn, hiển thị thông tin hồ sơ cho họ và nhiều hơn nữa.
Nếu bạn đang sử dụng định tuyến cơ sở dữ liệu, bạn có thể có nhiều hơn một kết nối cơ sở dữ liệu. Mã như thế này cho phép bạn thấy các kết nối trong một phiên. Bạn có thể đặt lại các số liệu thống kê giống như với một kết nối duy nhất: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() )
Bạn có thể sử dụng một Djug debug_toolbar để xem truy vấn SQL. Hướng dẫn từng bước để sử dụng debug_toolbar:
pip install django-debug-toolbar
Cài đặt =
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Cài đặt = = tạo danh sách mới ở cuối tệp cài đặt và thêm danh sách bên dưới:
INTERNAL_IPS= [127.0.0.1']
Điều này sẽ cho phép gỡ lỗi chỉ chạy trên máy chủ phát triển nội bộ
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
Bạn sẽ thấy một tiện ích bổ sung trên trang web của mình tại 127.0.0.1 và nếu bạn nhấp vào hộp kiểm Truy vấn SQL, bạn thực sự có thể thấy thời gian chạy của truy vấn.