为何使用DRF时Django会为关联字段生成额外查询?
解决DRF中出现额外User全量查询的问题
问题原因
这条SELECT * FROM marketplace_user LIMIT 1000的额外查询,是django-debug-toolbar的内置面板触发的,和你的业务代码无关:
- django-debug-toolbar的
UsersPanel面板默认会查询系统用户表,拉取最多1000条记录,用于展示用户相关的调试信息,比如当前登录用户、系统用户列表等。 - 你的
ItemViewSet使用默认配置,不会触发这类全量用户查询,因此可以排除业务代码或DRF默认逻辑的问题。
验证步骤
要确认这个结论,你可以临时关闭django-debug-toolbar:
- 在
settings.py中,移除INSTALLED_APPS里的debug_toolbar,并注释掉中间件中的debug_toolbar.middleware.DebugToolbarMiddleware。 - 重启服务后,重新请求接口,检查是否还会生成这条查询。
处理方案
如果觉得这条查询干扰调试,可以通过以下方式解决:
- 禁用UsersPanel面板:在
settings.py中自定义debug toolbar的面板列表,注释掉UsersPanel:DEBUG_TOOLBAR_PANELS = [ 'debug_toolbar.panels.history.HistoryPanel', 'debug_toolbar.panels.timer.TimerPanel', 'debug_toolbar.panels.settings.SettingsPanel', 'debug_toolbar.panels.headers.HeadersPanel', 'debug_toolbar.panels.request.RequestPanel', 'debug_toolbar.panels.sql.SQLPanel', # 禁用用户面板,避免触发全量用户查询 # 'debug_toolbar.panels.users.UsersPanel', 'debug_toolbar.panels.staticfiles.StaticFilesPanel', 'debug_toolbar.panels.templates.TemplatesPanel', 'debug_toolbar.panels.cache.CachePanel', 'debug_toolbar.panels.signals.SignalsPanel', 'debug_toolbar.panels.logging.LoggingPanel', 'debug_toolbar.panels.redirects.RedirectsPanel', 'debug_toolbar.panels.profiling.ProfilingPanel', ] - 忽略该查询:如果不影响调试体验,可直接忽略——这只是debug工具的调试查询,生产环境关闭debug toolbar后就会消失。
内容的提问来源于stack exchange,提问作者Samir Neupane
相关产品推荐
相关产品推荐

