Django Rest Framework(v1.11.7)列表接口缺失记录问题排查求助
嘿,我来帮你一步步排查这个列表接口记录缺失的问题,咱们从最常见的原因开始梳理:
先确认QuerySet的实际返回量
虽然你写了queryset = Customer.objects.all(),但别直接默认它能返回所有记录。打开Django Shell执行下面的命令,对比一下数据库实际记录数和QuerySet返回的数量:python manage.py shell from your_app.models import Customer print("数据库总记录数:", Customer.objects.all().count())如果Shell里的数量就和数据库实际记录不符,那大概率是模型的Manager被自定义过滤了——比如模型里写了
objects = CustomManager(),而这个管理器默认排除了软删除或者特定状态的记录。检查权限类的自动过滤
DRF的ModelViewSet默认会应用全局权限配置,比如IsAuthenticated或者自定义权限类。如果当前请求用户没有权限查看某些记录,这些记录会被自动过滤掉。你可以临时在ViewSet里关闭权限做测试:class CustomerViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() serializer_class = CustomerSerializer permission_classes = [] # 临时关闭权限,验证是否是权限导致的记录缺失如果关闭权限后所有记录都正常返回了,就去检查你的权限类逻辑,看看是不是对
Customer对象做了针对性的权限过滤。排查分页设置的影响
要是你在项目settings.py里配置了全局分页,比如:REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10 }那列表接口只会默认返回第一页的10条数据,其他记录需要通过分页参数(比如
?page=2)获取。你可以临时在ViewSet里关闭分页验证:class CustomerViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() serializer_class = CustomerSerializer pagination_class = None # 关闭分页,查看完整记录列表检查是否重写了
get_queryset方法
有没有可能你或者团队成员在ViewSet里重写了get_queryset()方法,但不小心加了过滤逻辑?比如:def get_queryset(self): # 比如这里只返回了active=True的记录 return Customer.objects.filter(active=True)仔细检查ViewSet的代码,看看有没有自定义的
get_queryset或者混入了其他会修改QuerySet的Mixin类。数据库层面的直接验证
直接登录数据库执行查询,确认实际存在的记录数:SELECT COUNT(*) FROM your_app_customer; -- 替换成你的实际表名如果数据库里的记录数和Shell里的一致,但接口返回少,那再回到DRF的配置和ViewSet代码找问题;如果数据库里的记录本身就少,那就是数据插入环节出了问题。
版本兼容性小提醒
你提到的是Django Rest Framework v1.11.7?其实DRF的正式版本是从3.x开始的,可能你混淆了Django的版本(比如Django 1.11.7)?如果是Django 1.11搭配DRF 3.x的组合,虽然大部分场景兼容,但可以确认一下DRF的实际版本:pip show djangorestframework避免版本冲突导致的异常。
内容的提问来源于stack exchange,提问作者ewulff

