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

DRF ListAPIView的get_queryset按用户类型过滤返回空列表求助

排查解决步骤
  • 1. 修复用户类型判断的类型匹配问题

    90%以上的概率是该问题导致:你的is_company、is_employee字段是Django模型的BooleanField类型,存储的是布尔值True/False,但代码中是和字符串'True'做相等判断,布尔值和字符串永远不相等,两个分支都不会进入,get_queryset无返回值导致空列表。
    直接修改判断逻辑即可:

    # 原错误写法
    if self.request.user.is_company == 'True':
    elif self.request.user.is_employee == 'True':
    
    # 修改后写法
    if self.request.user.is_company:
    elif self.request.user.is_employee:
    

    如果你的字段确实是字符串类型存储状态,可在方法开头加打印确认字段值和类型:

    print("is_company值:", self.request.user.is_company, "类型:", type(self.request.user.is_company))
    print("is_employee值:", self.request.user.is_employee, "类型:", type(self.request.user.is_employee))
    
  • 2. 修复员工分支的查询语法错误

    员工逻辑中com = Company.objects.filter(pk=self.request.user.id).pk写法错误:filter返回的是查询集对象,没有pk属性,运行会抛出异常,你单独测试企业分支未触发该逻辑所以没发现。
    修正写法:

    # 用get取单个实例再拿pk
    com = Company.objects.get(pk=self.request.user.company_id).pk
    # 更高效的写法:如果员工表有company外键,直接取外键id即可
    com = self.request.user.company_id
    
  • 3. 验证过滤条件的有效性

    前两步修复完仍有问题的话,打印中间变量确认逻辑是否正确:

    1. 打印构造的emp列表,确认里面的ID是否和Product表的owner字段值匹配
    2. 在Django Shell中手动执行对应逻辑,看是否能返回数据:
    # 替换为真实测试用户ID
    test_user = User.objects.get(id=1)
    emp_list = list(Employee.objects.filter(company=test_user.id).values_list('pk', flat=True))
    emp_list.append(test_user.id)
    print(Product.objects.filter(owner__in=emp_list).count())
    
  • 4. 补充异常分支避免空返回

    原代码没有处理非企业/员工类型的用户,get_queryset无返回值会默认返回空列表,建议补充分支:

    from rest_framework.exceptions import PermissionDenied
    
    def get_queryset(self):
        if self.request.user.is_company:
            # 企业逻辑
        elif self.request.user.is_employee:
            # 员工逻辑
        else:
            raise PermissionDenied("用户身份不合法")
    

内容的提问来源于stack exchange,提问作者Rahul Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:05