尝试访问或新增Detail模型对象时Django Admin加载过慢问题求助
问题修复方案
根因排查方向
18万条数据量级不会导致单条访问、对象创建无限加载,且同量级其他模型无异常,可以直接排除总数据量问题,优先排查以下几点:
- 检查
Detail模型的__str__方法:如果方法内部引用了外键关联对象,且没有做预加载,甚至存在外键循环引用查询,会在对象初始化、打印时触发大量额外查询甚至死循环,直接导致卡顿。
验证方式:本地启动Django shell执行以下代码,看是否卡住:from your_app.models import Detail obj = Detail.objects.first() print(obj) - 检查
Detail模型自定义方法:如果重写了save()、clean()方法,内部存在无索引的全表扫描类查询(比如未加索引的字段过滤、全表count统计),每次对象创建、修改时都会执行慢查询,表现为无限加载。 - 检查
Detail模型的Admin配置:如果Admin配置中直接将外键字段放在了fields、list_display等配置项中,且没有配置raw_id_fields,Django Admin默认会把外键渲染为下拉选择框,加载页面时会一次性拉取外键关联表的全部数据,关联表数据量稍大就会直接卡住,和你描述的创建对象时也异常的情况完全吻合。
对应修复方案
- 若为
__str__方法问题:优先简化__str__实现,仅使用Detail表自身的字段返回(比如return f"Detail[{self.id}]");如果确实需要展示外键关联内容,给外键查询加上select_related预加载,同时给关联字段增加数据库索引。 - 若为自定义方法慢查询问题:给对应查询的过滤字段加上数据库索引,执行
python manage.py makemigrations和python manage.py migrate生成并应用索引,同时优化查询逻辑避免全表扫描。 - 若为Admin外键渲染问题:在
DetailAdmin配置中添加raw_id_fields指定所有外键字段,示例如下:
配置后Admin会将外键渲染为搜索输入框,不会一次性拉取全部关联数据,直接解决加载卡顿问题。from django.contrib import admin from .models import Detail class DetailAdmin(admin.ModelAdmin): # 替换为你实际的外键字段名 raw_id_fields = ["related_order", "related_user"] admin.site.register(Detail, DetailAdmin)
验证步骤
修改完成后先在本地环境测试单对象查询、对象创建功能是否正常,再验证Admin页面的访问、新增操作,确认无异常后再部署到服务器即可。
内容的提问来源于stack exchange,提问作者XRSIL
相关产品推荐
相关产品推荐

