带有内联模型的Django管理页面加载非常缓慢

带有内联模型的Django管理页面加载非常缓慢,django,django-admin,Django,Django Admin,我有一个Django管理页面,用于一个具有单个内联模型的模型。当内联模型有许多项(如75项)时,页面加载速度非常慢(大约30秒)。即使我排除了内联模型上的所有字段,让它只呈现名称,这也是正确的。删除内联模型会导致页面加载速度非常快(以秒为单位) 如何更快地加载此页面?有两件事可以加快此页面的加载速度 设置DEBUG=False 缓存内联模型渲染中使用的数据库查询 调试=错误 页面加载缓慢的原因是Django管理员正在为内联模型的每个实例呈现一个子模板。对于75个内联模型实例,您将呈现75个额外

我有一个Django管理页面,用于一个具有单个内联模型的模型。当内联模型有许多项(如75项)时,页面加载速度非常慢(大约30秒)。即使我排除了内联模型上的所有字段,让它只呈现名称,这也是正确的。删除内联模型会导致页面加载速度非常快(以秒为单位)


如何更快地加载此页面?

有两件事可以加快此页面的加载速度

  • 设置
    DEBUG=False
  • 缓存内联模型渲染中使用的数据库查询

  • 调试=错误 页面加载缓慢的原因是Django管理员正在为内联模型的每个实例呈现一个子模板。对于75个内联模型实例,您将呈现75个额外模板,即使其中的内容很少。虽然呈现模板通常非常快,但如果您具有
    DEBUG=True
    ,则呈现的每个模板都会产生额外的开销,因为Django正在为其调试模式错误页面注入额外的上下文(在我的系统上,每个模板大约0.4秒)。这种额外的开销通常不明显,因为您通常只为单个页面呈现少数模板。但是,当渲染75个模板时,这会导致明显的延迟(75*0.4秒=30秒)


    缓存数据库查询 至少从Django 1.10开始,内联模型将进行任何必要的数据库查询,以呈现内联模型的每个实例。如果您的内联模型在内联模型上有任何外键,那么如果您的数据库连接很慢,那么这可能会非常低效。该技术是在初始化内联类的实例时(使用
    get\u formset\u with_inlines
    )运行数据库查询以获取这些外键的选择,然后用缓存的值替换内联上这些字段的选择以防止重复此数据库查询(使用
    formfield\u for_foreignkey


    请在此处查看我的解决方案:

    我的管理类如下所示:

    class ItemBazarInlineAdmin(AdminInlineWithSelectRelated):
        model = ItemBazar
    
        list_select_related = (
            'alumno_item__alumno__estudiante__profile',
            'alumno_item__item__anio_lectivo',
            'comprobante__forma_pago',
        )
    
    
    class ComprobanteAdmin(AdminWithSelectRelated):
        list_display = ('__str__', 'total', 'estado', 'fecha_generado', 'forma_pago', 'tipo', )
        list_filter = ('estado', 'forma_pago', )
    
        list_select_related = ('forma_pago', )
        inlines = (ItemServicioInlineAdmin, )
    

    我使用这个解决方案来加快内联的速度,但是现在我遇到了一个问题,内联中的元素没有在select中显示它们的实际值。我有一个模型:有很多标签的连续卷。每个标签都有重量、味道和状态。(这些都是外键)每卷有1000多个标签。我希望内联显示每个FK的当前值,但在“选择”列表中还有其他选项。我需要更改吗?@AndyPoquette这所做的只是覆盖内联的FKs选项。它应该保留选择当前值。如果我在发布的解决方案中有错误,请让我知道我确定不是你,而是我。我选择了一个不同的解决方案,但谢谢你!我最终使用了这个通用的解决方案
    class ItemBazarInlineAdmin(AdminInlineWithSelectRelated):
        model = ItemBazar
    
        list_select_related = (
            'alumno_item__alumno__estudiante__profile',
            'alumno_item__item__anio_lectivo',
            'comprobante__forma_pago',
        )
    
    
    class ComprobanteAdmin(AdminWithSelectRelated):
        list_display = ('__str__', 'total', 'estado', 'fecha_generado', 'forma_pago', 'tipo', )
        list_filter = ('estado', 'forma_pago', )
    
        list_select_related = ('forma_pago', )
        inlines = (ItemServicioInlineAdmin, )