Django admin:带有外键的ModelAdmin用户每行添加一个查询

时间:2011-08-12 20:24:17

标签: django django-models django-admin

我在Django管理员中遇到的问题: 我创建了一个ModelAdmin派生类。 此类的属性list_select_related设置为True。

如果我在list_display中向User模型添加外键字段,无论我做什么,显示的每一行都会以下列形式添加查询:

SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`password`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`is_superuser`, `auth_user`.`last_login`, `auth_user`.`date_joined`, `auth_user`.`picture_id` FROM `auth_user` WHERE `auth_user`.`id` = 1

它使管理员很慢,发生了什么?提前谢谢。

1 个答案:

答案 0 :(得分:1)

好的,我设法解决了这个问题。 您必须在代码中非常具体。 您必须像这样重写ModelAdmin.queryset,以防止运行那些额外无用的查询。 这使查询倒计时从286减少到7(对于100个项目的页面)。

编辑ModelAdmin.queryset

class MyModelAdmin(ModelAdmin):
    def queryset(self, request):
        qs = super(AccessAdmin, self).queryset(request)
        qs = qs.select_related('user','ip','user__picture').only('user__username','path','referrer','ip__id','ip__string','ip__country','time','user__id','id','ip__ip','user__picture','user__picture__id','user__picture__image')
        return qs

您必须仔细选择字段和外键。 如果您想知道,user.picture字段是使用Model.add_to_class方法添加的。