Django DRF搜索接口报错:method类型对象无len()属性
问题根因
报错由一个非常容易忽略的语法问题导致:你在自定义ProductQuerySet的search方法中,调用distinct时漏写了括号,导致方法最终返回的是distinct的绑定方法对象,而非执行去重后的QuerySet查询结果。
你断点看到的输出<bound method QuerySet.distinct of <ProductQuerySet [<Product: Product object (4)>, ...]>>已经直接指向了这个问题——返回值是方法本身,不是方法执行后的查询集。DRF的分页逻辑拿到这个方法对象后,尝试调用.count()、计算长度时自然会抛出类型错误。
修复步骤
打开商品模型文件,找到ProductQuerySet类下的search方法,修改存在问题的那一行即可:
原错误代码片段:
if user is not None: qs2 = self.filter(user=user).filter(lookup) qs = (qs | qs2).distinct return qs
修改为:
if user is not None: qs2 = self.filter(user=user).filter(lookup) qs = (qs | qs2).distinct() return qs
distinct是QuerySet的内置方法,必须加括号调用才会实际执行SQL去重逻辑、返回处理完成的查询集;不加括号只会拿到方法的引用对象,完全不符合DRF对get_queryset方法必须返回QuerySet实例的要求。
你写的settings分页配置、搜索视图逻辑、商品视图权限逻辑都没有问题,不需要做其他调整。
修复后验证
重启开发服务后重新访问搜索接口:
- 断点查看
results变量会显示为正常的ProductQuerySet对象,不再是绑定方法 - 分页逻辑可以正常计算结果总数、执行分页切片,不会再出现
object of type 'method' has no len()的报错 - 公开商品、当前登录用户私有商品的搜索合并、去重逻辑会按预期生效
内容的提问来源于stack exchange,提问作者Liondancer
相关产品推荐
相关产品推荐

