zoukankan      html  css  js  c++  java
  • Django Admin Cookbook-8如何在Django admin中优化查询

    8.如何在Django admin中优化查询?

    如果你的Admin后台中有很多计算字段,那么你需要对每个对象运行多个查询,这会使你的Admin后台变得非常慢。要解决此问题,你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。

    以下示例为Origin模型的中ModelAdmin管理模型:

    @admin.register(Origin)
    class OriginAdmin(admin.ModelAdmin):
        list_display = ("name", "hero_count", "villain_count")
        def hero_count(self, obj):
            return obj.hero_set.count()
        def villain_count(self, obj):
            return obj.villain_set.count()
    

    这会在列表视图页面的每行添加两个额外的查询。要解决计算的性能问题,你可以重写get_queryset并使用annotate来进行计算,然后在ModelAdmin方法中使用该annotated聚合字段。

    将ModelAdmin管理模型修改如下:

    @admin.register(Origin)
    class OriginAdmin(admin.ModelAdmin):
        list_display = ("name", "hero_count", "villain_count")
        def get_queryset(self, request):
            queryset = super().get_queryset(request)
            queryset = queryset.annotate(
                _hero_count=Count("hero", distinct=True),
                _villain_count=Count("villain", distinct=True),
            )
            return queryset
        def hero_count(self, obj):
            return obj._hero_count
        def villain_count(self, obj):
            return obj._villain_count
    

    每个对象没有额外的查询。你的Admin后台用起来仍像调用annotate聚合函数前一样流畅。

    返回目录

  • 相关阅读:
    Mybatis的基本步骤
    Log笔记
    通过vue-cli脚手架创建VUE项目
    c语言字符相关函数
    嵌入式:电路设计之三极管基础电路设计
    晶体三极管进行双路控制驱动电路设计
    三极管实用
    再谈一维数组、二维数组与指针、数组指针
    光电耦合器工作原理详细解说
    任务控制块
  • 原文地址:https://www.cnblogs.com/superhin/p/12171371.html
Copyright © 2011-2022 走看看