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

如何在Django中实现用户关联部门并查看本部门全部申诉?

实现方案

步骤1:给用户模型添加部门关联

根据项目阶段,推荐两种常用实现方式:

方式A:扩展用户资料(适合已使用默认User模型的项目)

创建Profile模型与默认User模型一对一关联,添加部门字段,同时把部门选项提取出来复用:

# models.py
from django.conf import settings
from django.db import models

# 提取公共部门选项,避免重复定义
DEPARTMENTS = [
    ("a", "DeptA"),
    ("b", "DeptB"),
    ("c", "DeptC"),
    # 其他部门...
]

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="profile")
    department = models.CharField(choices=DEPARTMENTS, max_length=10)  # 长度按需调整

class Appeal(models.Model):
    DEPARTMENTS = DEPARTMENTS
    title = models.CharField(max_length=400)
    department = models.CharField(choices=DEPARTMENTS)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="appeals"
    )

方式B:自定义User模型(适合新项目,未创建用户数据)

直接继承AbstractUser,在用户模型中添加部门字段:

# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

DEPARTMENTS = [
    ("a", "DeptA"),
    ("b", "DeptB"),
    ("c", "DeptC"),
    # 其他部门...
]

class CustomUser(AbstractUser):
    department = models.CharField(choices=DEPARTMENTS, max_length=10)

class Appeal(models.Model):
    DEPARTMENTS = DEPARTMENTS
    title = models.CharField(max_length=400)
    department = models.CharField(choices=DEPARTMENTS)
    author = models.ForeignKey(
        CustomUser, on_delete=models.CASCADE, related_name="appeals"
    )

注意:使用自定义User模型需在settings.py中配置AUTH_USER_MODEL = "你的应用名.CustomUser",且要在首次数据库迁移前完成配置。

步骤2:修改视图实现部门申诉过滤

根据选择的用户模型方式,调整查询逻辑:

对应方式A(Profile扩展):

# views.py
from django.shortcuts import get_list_or_404, render

def appeal_list_view(request):
    # 获取当前用户关联的部门
    user_department = request.user.profile.department
    # 过滤出本部门的所有申诉
    visible_appeals = get_list_or_404(Appeal, department=user_department)
    return render(request, "appeals/index.html", {"appeals": visible_appeals})

对应方式B(自定义User模型):

# views.py
from django.shortcuts import get_list_or_404, render

def appeal_list_view(request):
    # 直接从用户模型获取部门
    user_department = request.user.department
    # 过滤出本部门的所有申诉
    visible_appeals = get_list_or_404(Appeal, department=user_department)
    return render(request, "appeals/index.html", {"appeals": visible_appeals})

步骤3:更新数据库

修改模型后,执行以下命令完成数据库迁移:

python manage.py makemigrations
python manage.py migrate

关于部门组方案的说明

用Django组关联部门并非必要,组的核心作用是权限控制(比如不同部门用户的操作权限差异)。你的需求只是关联部门并过滤数据,直接给用户添加部门字段是更轻量、直接的方案。如果后续需要基于部门做权限管控,再结合组功能即可。

内容的提问来源于stack exchange,提问作者RafG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:02:41