2.如何在Django admin 优化查询

如果在你的admin有大量的计算字段,你可能会对每个对象进行多个查询,导致你的admin页面变得非常慢,要修复这个问题,你可以在 ModelAdmin上注释这些计算字段。 让我们以下面这个ModelAdmin 举例子,

  1. @admin.register(Origin)
  2. class OriginAdmin(admin.ModelAdmin):
  3. list_display = ("name", "hero_count", "villain_count")
  4. def hero_count(self, obj):
  5. return obj.hero_set.count()
  6. def villain_count(self, obj):
  7. return obj.villain_set.count()

这将为listview页面中的每一行添加两个额外的查询。要解决这个问题,你可以覆盖get_queryset来注释计算字段,然后在ModelAdmin方法中使用带注释的字段。

修改之后,你的ModelAdmin如下:

  1. @admin.register(Origin)
  2. class OriginAdmin(admin.ModelAdmin):
  3. list_display = ("name", "hero_count", "villain_count")
  4. def get_queryset(self, request):
  5. queryset = super().get_queryset(request)
  6. queryset = queryset.annotate(
  7. _hero_count=Count("hero", distinct=True),
  8. _villain_count=Count("villain", distinct=True),
  9. )
  10. return queryset
  11. def hero_count(self, obj):
  12. return obj._hero_count
  13. def villain_count(self, obj):
  14. return obj._villain_count

这样每个对象没有额外的查询。 你的管理页面像之前没有调用annotate那样 2.如何在Django admin 优化查询 - 图1