Django 3.0 Admin仅显示单条记录:迁移后分页异常求助
重写
get_queryset时犯了低级错误
如果你在Admin类里自定义了get_queryset方法,不小心返回了单个对象(比如用了.first()、.get())而不是完整的查询集,就会出现这情况。第一页能拿到那唯一的一条,但后续分页的OFFSET查询会从空结果里取,自然没数据,但计数还是原查询集的总数。比如别这么写:class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) return qs.first() # 错!要直接返回qs数据库主键/索引出问题了
迁移操作可能搞坏了主键的连续性或者相关索引,导致Django依赖的LIMIT/OFFSET分页查询失效。你可以直接在数据库里跑SQL验证:SELECT * FROM myapp_mymodel LIMIT 1 OFFSET 1;,如果返回空,说明数据库层面查不到后续数据,得检查主键是否重复、索引是否失效,或者数据有没有隐性损坏。排序字段太“水”或者分页配置错了
如果Admin的ordering字段是个大量重复值的字段(比如状态字段全是0),数据库排序结果不稳定,分页时就会出现数据丢失。另外也检查下有没有误改paginate_by,不过这个一般不会只让第一页显1条,但也别漏了。迁移脚本留了坑
迁移时如果改了字段(比如加非空约束、改字段类型),但数据迁移不彻底,可能导致除第一条外的数据被Admin隐性过滤。比如新增了非空字段,迁移时给了默认值,但后续某些数据的该字段值不符合Admin的过滤逻辑;或者迁移时误删了部分数据的查询权限(比如关联字段的外键失效)。Django 3.0本身的分页Bug
Django 3.0有几个已知的分页Bug,尤其是当查询集主键重复或者排序不稳定时会触发。建议升级到3.0的最新小版本(比如3.0.14),很多这类问题都被修复了。
内容的提问来源于stack exchange,提问作者voodoo-burger

