如何在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
相关产品推荐
相关产品推荐

