Django 5.0如何过滤Data模型managers字段仅显示同部门用户
问题解决:Django Admin中过滤同部门管理者
错误原因分析
你当前的代码存在两个核心问题:
- 错误地从
Data.objects中过滤,而managers字段关联的是User模型,我们需要的是User的查询集,而非Data的。 - ORM查询中跨关联模型的字段需要用双下划线(
__),而非点号(.),这是Django ORM的语法规则。
修正后的代码
在你的Admin类中重写formfield_for_manytomany方法,替换为以下代码:
def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "managers": # 获取当前登录用户的部门 current_user_dept = request.user.userprofile.department # 过滤出同部门的User对象 kwargs["queryset"] = User.objects.filter( userprofile__department=current_user_dept ).exclude(id=request.user.id) # 可选:排除当前用户自己 return super().formfield_for_manytomany(db_field, request, **kwargs)
补充说明
- 如果你需要处理用户未创建
UserProfile的情况(避免DoesNotExist异常),可以添加判断:def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "managers": # 先检查当前用户是否有UserProfile且部门不为空 if hasattr(request.user, 'userprofile') and request.user.userprofile.department is not None: current_user_dept = request.user.userprofile.department kwargs["queryset"] = User.objects.filter( userprofile__department=current_user_dept ).exclude(id=request.user.id) else: # 若无Profile或部门为空,返回空查询集 kwargs["queryset"] = User.objects.none() return super().formfield_for_manytomany(db_field, request, **kwargs) exclude(id=request.user.id)是可选操作,用于避免用户选择自己作为管理者,根据业务需求决定是否保留。
内容的提问来源于stack exchange,提问作者Br1lliantJim
相关产品推荐
相关产品推荐

