首页 > 解决方案 > 如何查看 Django ORM 运行的查询?

问题描述

我有DEBUD = True档案settings.py。我MySQL有用 django 配置的数据库。我有一个Course模型courses/models.py。在courses/views.py中,我有:

@api_view(['GET'])
def courses_list(request):
  courses = Course.objects.all()
  serializer = CourseSerializer(courses, many=True)
  return Response(serializer.data)

现在,如果我向邮递员提出请求以点击此视图,我认为SELECT * FROM COURSES必须执行一些查询。当我向某个后端 URL 发出请求时,如何查看已执行哪些查询?

我也按照这里from django.db import connection的描述尝试过,但是得到了这样的空数组:

>>> from django.db import connection
>>> connection.queries
[]

请帮助我实现我想要的。

标签: pythondjangodjango-rest-frameworkdjango-viewsdjango-orm

解决方案


如果您在单独的 shell 中运行它,那么它当然不会包含另一个正在运行的程序的查询。答案涉及您在 shell 本身中执行的查询。

例如,如果您将使用:

>>> print(Course.objects.all())
>>> from django.db import connection
>>> connection.queries

它将显示一个查询,因为您强制QuerySet外壳中评估 a 。

您可以使用像django-sqlprint-middleware打印查询这样的包。所以你安装它,例如在本地环境中:

pip install django-sqlprint-middleware

MIDDLEWARE然后在设置中添加这个中间件settings.py

# settings.py

MIDDLEWARE = (
    # …,
    'django_sqlprint_middleware.SqlPrintMiddleware',
    # …,
)

只会DEBUG在或TESTING设置为时打印查询True。但是,我建议无论如何不要在生产中使用它。


推荐阅读