Zag*_*ags 2 django django-admin
我有一个Django管理页面,用于具有单个内联模型的模型.当内联模型有许多项目(如75)时,页面加载速度非常慢(大约30秒).即使我排除了内联模型中的所有字段,只需渲染名称,也是如此.删除内联模型会导致页面加载速度非常快(以秒为单位).
如何让此页面加载速度更快?
Zag*_*ags 10
您可以采取两项措施来加快此页面的加载速度.
DEBUG = False.页面加载缓慢的原因是Django管理员正在为内联模型的每个实例呈现子模板.使用75个内联模型实例,即使其中包含最少的内容,您也可以渲染75个额外的模板.虽然渲染模板通常非常快,但如果你有DEBUG = True,你会为你渲染的每个模板带来额外的开销,因为Django正在为其调试模式错误页面注入额外的上下文(这在我的系统上每个模板大约0.4秒).这种额外的开销通常不会引人注意,因为您通常只为单个页面呈现少量模板.但是,渲染75个模板时,这会增加明显的延迟(75*0.4秒= 30秒).
至少从Django 1.10开始,内联模型将进行任何必要的数据库查询,以便为内联模型的每个实例呈现它.如果内联模型在内联模型中有任何外键,如果数据库连接速度较慢,则效率非常低.该技术是在初始化内联类的实例(使用get_formsets_with_inlines)时为这些外键的选择运行数据库查询,然后将内联中这些字段的选项替换为缓存值,以防止重复此数据库查询(使用formfield_for_foreignkey).
class Manufacturer(models.Model):
...
class OperatingSystem(models.Model):
...
class Computer(models.Model):
manufacturer = models.ForeignKey(Manufarturer)
owner = models.ForeignKey(User)
operating_system = models.ForeignKey(OperatingSystem)
...
class ComputerAdmin(admin.StackedInline):
model = Computer
def formfield_for_foreignkey(self, db_field, request, **kwargs):
field = super(ComputerAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
if db_field.name == "owner" and hasattr(self, "cached_owners"):
field.choices = self.cached_owners
elif db_field.name == "manufacturer" and hasattr(self, "cached_manufacturers"):
field.choices = self.cached_manufacturers
elif db_field.name == "operating_system" and hasattr(self, "cached_operating_systems"):
field.choices = self.cached_operating_systems
return field
class ManufacturerAdmin(admin.ModelAdmin):
inlines = (ComputerAdmin,)
def get_formsets_with_inlines(self, request, obj=None):
for inline in self.get_inline_instances(request, obj):
inline.cached_owners = [(i.pk, str(i)) for i in User.objects.all()]
inline.cached_manufacturers = [(i.pk, str(i)) for i in Manufacturer.objects.all()]
inline.cached_operating_systems = [(i.pk, str(i)) for i in OperatingSystem.objects.all()]
yield inline.get_formset(request, obj), inline
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |