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_id3. 验证过滤条件的有效性
前两步修复完仍有问题的话,打印中间变量确认逻辑是否正确:
- 打印构造的
emp列表,确认里面的ID是否和Product表的owner字段值匹配 - 在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
相关产品推荐
相关产品推荐

