Python “如何修复”;在“LogEntry.user”上检测到潜在的不必要的紧急负载;

Python “如何修复”;在“LogEntry.user”上检测到潜在的不必要的紧急负载;,python,django,optimization,query-optimization,select-n-plus-1,Python,Django,Optimization,Query Optimization,Select N Plus 1,我正在用pluginnplusone()创建一个新的Django 2.2项目。当我尝试打开/admin URL时,我收到下一个错误“在LogEntry.user上检测到潜在的不必要的急切负载” 当数据库中至少有1条记录时,就会出现此问题 models.py class Post(models.Model): author=models.ForeignKey(用户, on_delete=models.CASCADE) title=models.CharField(最大长度=200) 已创建日期=模

我正在用plugin
nplusone
()创建一个新的Django 2.2项目。当我尝试打开/admin URL时,我收到下一个错误“在
LogEntry.user
上检测到潜在的不必要的急切负载” 当数据库中至少有1条记录时,就会出现此问题

models.py

class Post(models.Model):
author=models.ForeignKey(用户,
on_delete=models.CASCADE)
title=models.CharField(最大长度=200)
已创建日期=模型.DateTimeField(自动现在添加=真)
body=models.TextField()
slug=models.SlugField(最大长度=100,唯一性=True)
预览\u image=models.ImageField(将\u上传到='images',blank=True)
类元:
详细名称='Post'
详细名称复数='Posts'
排序=['-id']
定义(自我):
返回自己的标题
def get_绝对_url(自身):
返回反向('post',args=(self.slug,))
管理员

admin.site.register(Post,PostAdmin)
调试SQL

从“django_会话”中选择“django_会话”,“会话密钥”,“django_会话”,“会话数据”,“django_会话”,“过期日期”,其中(“django_会话”,“过期日期”>“2019-04-30 06:11:28.376554”和“django_会话”,“会话密钥”=“hbwpegj1vpkv5wdkbqr38ty55s3cm38”);参数=('2019-04-30 06:11:28.376554','hbwpegj1vpvkv5wdkbqr38ty55s3cm38')
选择“auth\u user”、“id”、“auth\u user”、“password”、“auth\u user”、“last\u login”、“auth\u user”、“is\u superuser”、“auth\u user”、“username”、“auth\u user”、“first\u name”、“auth\u user”、“last\u name”、“auth\u user”、“is\u staff”、“auth\u user”、“is\u active”、“auth\u user”、“auth\u user”、“加入日期”从“auth\u user”开始,其中“auth\u user”“auth\u user”“id”=1;args=(1,)
选择“django_管理日志”,“id”,“django_管理日志”,“操作时间”,“django_管理日志”,“用户id”,“django_管理日志”,“内容类型id”,“django_管理日志”,“对象id”,“django_管理日志”,“对象报告”,“django_管理日志”,“操作标志”,“django_管理日志”,“更改消息”,“验证用户”,“验证用户”,“验证用户”,“验证用户”,“最后一次登录”,“身份验证用户”、“超级用户”、“身份验证用户”、“用户名”、“身份验证用户”、“名字”、“身份验证用户”、“姓氏”、“身份验证用户”、“电子邮件”、“身份验证用户”、“身份验证人员”、“身份验证用户”、“身份验证用户”、“活动用户”、“身份验证用户”、“身份验证用户”、“加入日期”、“django内容类型”、“id”、“django内容类型”、“应用程序标签”、“django内容类型”、“模型”来自于“django管理日志”内部用户(“身份验证”)django_admin_log.“user_id”=“auth_user.“id”)在(“django_admin_log.“content_type_id”=“django_content_type”。“id”)中的“django_admin_log.“user_id”=1个“django_admin_log”订单。“action_time”描述限制10;args=(1,)

我发现N+1很少对Django admin感到满意-要么相关条目(如用户组)被延迟加载,在大型列表中造成N+1问题,要么它们被预取(),然后在单用户页面上检测到“不必要的急切加载”

问题是相同的基本ModelAdmin查询集用于列表页面和单个对象页面,因此避免这两个问题并不容易

在有人提供一个简单的解决方案为不同的管理页面创建不同的“预回迁”查询集之前,我已经将这些模型列为白名单,如下所示。只需使用django调试工具栏检查这些管理页面上是否没有N+1请求

NPLUSONE_WHITELIST = [
    {"model": "admin.LogEntry", "field": "user"},
    {"model": "accounts.User", "field": "groups"},
]