Django筛选用户所属项目时报User对象不可迭代错误如何解决
报错原因
错误触发点是Project.objects.filter(team__in = user)这行代码:
__in是Django ORM的范围查询语法,要求右侧参数必须为可迭代对象(如列表、元组、查询集等),你传入的是单个User实例,不符合参数要求,因此抛出类型错误。
解决方案
两种正确写法可选:
- 写法1(最推荐,多对多关联查询标准写法):直接用多对多字段名匹配用户实例,Django会自动处理关联查询逻辑
projects = Project.objects.filter(team=user) - 写法2(兼容
__in语法的修改方式):把单个用户实例放到列表/元组这类可迭代对象中再传入projects = Project.objects.filter(team__in=[user])
额外性能优化建议
你当前统计数量用的len(tickets)、len(projects)会先把所有符合条件的记录全部查询到内存中再统计长度,数据量大会浪费性能,建议改用Django ORM内置的count()方法,直接在数据库层执行COUNT统计,效率更高,修改后的完整视图代码如下:
@login_required def index(request): user = request.user tickets = Ticket.objects.filter(assigned_to=user) ticket_count = tickets.count() projects = Project.objects.filter(team=user) project_count = projects.count() context = { 'tickets':tickets, 'ticket_count':ticket_count, 'projects':projects, 'project_count':project_count, } return render(request, 'bugtracker_app/index.html', context)
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

