Django admin:具有 User 外键的 ModelAdmin 每行添加一个查询

发布于 2024-11-29 06:01:01 字数 557 浏览 0 评论 0原文

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

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

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

它使管理变得非常慢,这是怎么回事?提前致谢。

An issue I have in Django admin :
I created a ModelAdmin derived class.
This class has an attribute list_select_related set to True.

If I add a foreign key field to the User model in list_display, whatever I do, every row displayed adds a query in the following form :

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

It makes the admin quite slow, what is going on ? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

病毒体 2024-12-06 06:01:01

好的,我设法解决了这个问题。
您的代码必须非常具体。
您必须像这样重写 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 方法添加的。

Okay, I managed to resolve the issue.
You have to be very specific in your code.
You have to override ModelAdmin.queryset like this to prevent those extra useless queries from being run.
This got the query count down from 286 to 7 (for a page of 100 items).

Editing 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

You will have to select your fields and your foreign keys carefully.
If you were wondering, the user.picture field was added with the Model.add_to_class method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文