Django项目中仅展示登录用户所属项目的实现问题
解决Django视图中仅展示登录用户项目的问题
嘿,作为编程新手遇到这个问题很正常,我来帮你梳理清楚!
你遇到的报错Cannot query "Simone": Must be "Worker" instance,核心原因很明确:你的Project模型里的worker字段关联的是Worker模型,而不是直接关联User模型。你之前直接用request.user(这是个User实例)去过滤,Django自然会报错——它需要的是Worker对象,不是User对象。
因为你说不能修改模型,那我们就通过Django ORM的跨表查询来解决这个问题,具体步骤如下:
1. 理清关联关系
你的模型关联链是:Project → Worker(外键) → User(Worker模型里的worker字段)
要找到当前登录用户对应的所有项目,需要通过Worker模型作为中间层,关联到User。
2. 修改视图中的查询语句
把原来的:
user_projects = Project.objects.filter(worker=user).order_by('deadline')
改成:
user_projects = Project.objects.filter(worker__worker=user).order_by('deadline')
这里的双下划线__是Django ORM的专属语法,用来表示跨关联表查询:
- 第一个
worker是Project模型里的外键字段(指向Worker) - 第二个
worker是Worker模型里关联User的字段
这样就能准确筛选出当前登录用户作为工人的所有项目了。
3. 完整修改后的视图代码
from django.shortcuts import render from django.contrib.auth.decorators import login_required from .models import Project @login_required(login_url='/accounts/login/') def projectsWorkers(request): user = request.user # 这里修改了filter的条件,通过Worker关联到User user_projects = Project.objects.filter(worker__worker=user).order_by('deadline') template = 'projects/projects-worker-home.html' return render(request, template, {'user_projects': user_projects, 'user': user})
额外小提示
如果之后需要做负责人的项目视图,逻辑是完全一样的,只需要把查询条件改成:
user_projects = Project.objects.filter(responsable__responsable=user).order_by('deadline')
另外要注意:确保每个登录用户都有对应的Worker(或Responsable)实例,如果某个用户没有创建对应的Worker记录,查询结果会是空的哦!
内容的提问来源于stack exchange,提问作者Fede
相关产品推荐
相关产品推荐

