如何输出Django Admin生成的SQL

3 投票
2 回答
2055 浏览
提问于 2025-04-18 02:16

我想知道如何输出Django后台生成的SQL查询,这样我就能看到在dhangelist页面上查询结果的SQL语句。我尝试通过重写queryset()来实现:

def queryset(self, *args, **kwargs):
    qs = super(MyAdmin, self).queryset(*args, **kwargs)
    print 'sql:',qs.query
    return qs

但是即使我在浏览/admin/myapp/mymodel/?segment=123&date=2012-1-1这个链接,它显示的查询却是:

sql: SELECT myapp_mymodel.id, myapp_mymodel.segment, myapp_mymodel.start_date
FROM myapp_mymodel ORDER BY myapp_mymodel.start_date ASC

你会注意到,我在URL中指定的过滤条件完全没有出现。

我正在尝试调试一个奇怪的问题:当我手动在SQL中查询这个表时,我能看到一个结果,但Django后台显示的却是完全不同的内容。我怀疑Django可能有个bug,导致生成了错误的SQL语句,但我需要看到实际的SQL才能确认这个问题。

我使用的是Django 1.5。

2 个回答

3

我在使用一个叫做 debug_toolbar 的工具:https://pypi.python.org/pypi/django-debug-toolbar

你可以去看看。这个工具真的很有用。

8

你可以在settings.py文件中简单地设置这个日志配置,这样所有的SQL查询就会在控制台上显示出来。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG'
        },
    }
}

这一部分就是负责打印的。

       'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG'
        },

撰写回答