我在 Django Admin 中的一些视图加载时间过长。调试 Django Admin 视图以查看正在咀嚼循环的最佳方法是什么?
4 回答
正如rantanplan 评论的那样,django 调试工具栏是开始分析的最简单方法(显示在页面加载时执行的所有查询、它们的解释、它们的执行时间等)。您还可以在此处查看有关分析慢速 django 安装的问题: 如何根据执行时间分析 django 应用程序?
如果他们的表非常非常大(几百万条记录就可以了)并且表引擎是 MySQL 的 InnoDB,我也在 Django Admin 中看到了特定模型。我花了一段时间才想出解决方法,让我的 Django 管理员再次为拥有 100M+ 记录的表而嗡嗡作响。根本问题最终是COUNT(*)
页面加载时的昂贵查询以及每当我使用search_fields
ModelAdmin 中的一个查询查询时构造不佳的搜索查询。
我在这里记录了我的所有解决方案,以便他们有一天可以帮助陷入困境的 Django 同胞:http: //crailabenz.me/2013/06/12/how-i-made-django-admin-scale/
如果您将 Django 与 MySQL 一起使用,那么 MySQL 中存在一个带有 INNER JOINs 优化的错误。如果您尝试在Admin.list_display
Django 中使用外键,则会生成带有排序和 INNER JOIN 的查询,这在 MySQL 中非常慢。
有两种解决方案:
使用 django-mysql-fix 后端:https ://pypi.python.org/pypi/django-mysql-fix
get_query_set
在 AdminChangeList 中覆盖 - 删除和select_related
设置prefetch_related
字段 - 更多详细信息在我的其他答案中:https ://stackoverflow.com/a/23097385/1178806
这是一些关于由具有许多记录的 ForeignKey 表引起的缓慢编辑表单的一些很好的答案 Django 管理员更改表单加载速度很慢
关于列表视图:1)您可以添加 list_per_page 选项并显示更少的结果:
class EventAdmin(admin.ModelAdmin):
list_per_page = 20
2)或使用select_related():
2.1) 对于 django < 1.6:
class EventAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
2.2) 对于 django >= 1.6:
class EventAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
当然,将 foreign_key_field1 和 foreign_key_field2 等替换为适当的字段名称。