2012-10-27 54 views
10

Django Admin中的一些视图需要很长的时间来加载。 调试Django Admin视图以查看什么是咀嚼周期的最佳方式是什么?调试缓慢的Django管理视图

+6

https://github.com/django-debug-toolbar/django-debug-toolbar#readme – rantanplan

+0

你可以尝试添加'list_select_related = True'属性给予管理员类 – yedpodtrzitko

回答

3

我也在Django Admin的特定模型中看到过,如果它们的表非常非常大(数百万条记录可以做到这一点),并且表引擎是MySQL的InnoDB。我花了一段时间才弄清楚解决方法,让我的Django管理员再次为拥有100M +记录的表哼唱。根本问题最终导致在页面加载中查询费用高昂,并且在我使用ModelAdmin中的search_fields之一时,构建的搜索查询结构也不佳。

我这里记录我所有的解决方案,让他们有一天可能会帮助有困难的同胞的Django-ER:http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/

+2

嗯,你应该总结/给解决方案在这里以防链路中断(再次)。 – SamB

+1

这个答案很有效,bug记住如果你定制'ModelAdmin',你应该重写'get_queryset',因为'django.admin'使用'_default_manager'。更多信息查看[this](http://stackoverflow.com/questions/1545067/django-specify-which-model-manager-django-admin-should-use)。 – shellbye

0

如果你使用Django与MySQL则是在MySQL中有内一个bug加入优化。如果您尝试在Admin.list_display中使用外键,那么Django将在MySQL中使用非常缓慢的排序和INNER JOIN生成查询。

有两种解决方案,即:

  1. 使用Django MySQL的修复后端:https://pypi.python.org/pypi/django-mysql-fix

  2. 覆盖get_query_set在AdminChangeList - 删除select_related并设置prefetch_related领域 - 更多细节在我的其他在这里回答:https://stackoverflow.com/a/23097385/1178806

-1

这里有一些很好的 1)您可以添加list_per_page选项,显示较少的结果:对于因ForeignKey的表有许多记录 Django admin change form load quite slow

关于列表视图慢编辑表单nswers

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等用适当的字段名称。