您可以做两件事来加快此页面的加载速度。
- 设置
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