You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 5.0如何过滤Data模型managers字段仅显示同部门用户

问题解决:Django Admin中过滤同部门管理者

错误原因分析

你当前的代码存在两个核心问题:

  1. 错误地从Data.objects中过滤,而managers字段关联的是User模型,我们需要的是User的查询集,而非Data的。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:52:32