You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:06:04