为什么Django API返回空数组?附序列化器与视图层代码
问题排查与解决方法
返回空数组的核心原因是视图中get_queryset设置了按当前登录用户ID过滤owner字段,你可以按以下步骤逐一排查:
- 第一步:验证接口请求是否携带了有效登录凭证
DRF未登录状态下request.user为匿名用户,user.id为空值,过滤结果必然为空。你可以临时在get_queryset方法中添加日志确认登录状态:
def get_queryset(self): # 调试用,上线需删除 print("是否登录:", self.request.user.is_authenticated, "用户ID:", self.request.user.id) return models.Place.objects.filter(owner_id=self.request.user.id)
启动服务后调用接口,查看控制台输出的登录状态和用户ID是否符合预期。
- 第二步:确认数据库存在对应用户的Place数据
进入Django shell直接执行查询验证数据是否存在:
python manage.py shell
执行查询语句(替换为你实际的应用名和测试用户ID):
from your_app_name.models import Place # 测试用户ID以1为例 print(Place.objects.filter(owner_id=1).count())
如果查询结果为0,说明你之前创建Place数据时没有正确绑定owner字段,或绑定的用户ID和当前登录用户ID不一致。
- 第三步:验证过滤逻辑正确性
可以临时修改get_queryset返回全量数据测试:
def get_queryset(self): return models.Place.objects.all()
如果此时接口能正常返回数据,说明问题完全出在owner过滤条件上,可进一步检查Place模型的owner字段命名是否正确,有没有拼写错误。
- 第四步:确认DRF认证类配置正确
如果你的项目用了Token、JWT等非session登录方式,需要确保全局或当前视图配置了对应的认证类,否则DRF无法识别请求携带的登录凭证,会把所有请求识别为匿名用户,示例局部配置如下:
from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated class PlaceList(generics.ListCreateAPIView): serializer_class = serializers.PlaceSerializer authentication_classes = [SessionAuthentication, TokenAuthentication] permission_classes = [IsAuthenticated] def get_queryset(self): return models.Place.objects.filter(owner_id=self.request.user.id) def perform_create(self, serializer): serializer.save(owner=self.request.user)
内容的提问来源于stack exchange,提问作者user8887187
相关产品推荐
相关产品推荐

