Django REST场景下实现用户关联项目、新增项目自动分配创建人方案问询
Django REST 框架用户-项目关联功能实现方案
1. 模型层关联配置
用户和项目属于多对多关联关系,你可以选择用Django自动生成关联表,或者自定义独立的关联表存储配对信息:
方案1:自动生成关联表(无额外字段需求时推荐)
from django.db import models from django.contrib.auth.models import User class Project(models.Model): name = models.CharField(max_length=128, verbose_name="项目名") # 其他项目字段如描述、创建时间等自行添加 users = models.ManyToManyField(User, related_name="related_projects", verbose_name="关联用户")
related_name用于反向查询,后续可直接通过user.related_projects拿到单个用户关联的所有项目。
方案2:自定义关联表(需要存储额外配对信息时使用)
from django.db import models from django.contrib.auth.models import User # 独立的用户-项目关联表 class UserProjectRel(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="关联用户") project = models.ForeignKey("Project", on_delete=models.CASCADE, verbose_name="关联项目") # 可自行添加关联角色、绑定时间等额外字段 class Project(models.Model): name = models.CharField(max_length=128, verbose_name="项目名") # 其他项目字段 users = models.ManyToManyField(User, through=UserProjectRel, related_name="related_projects", verbose_name="关联用户")
2. 手动创建关联的实现方式
如果需要从用户、项目列表中选中对象手动绑定关联,可按以下方式操作:
- 使用自动生成关联表时:
# 取出目标用户和项目对象 target_user = User.objects.get(id=用户ID) target_project = Project.objects.get(id=项目ID) # 建立关联 target_project.users.add(target_user) # 批量绑定多个用户 target_project.users.add(user1, user2, user3) # 反向绑定也可:target_user.related_projects.add(target_project) # 解除关联用remove,清空关联用clear target_project.users.remove(target_user)
- 使用自定义关联表时:
# 直接创建关联表条目即可 UserProjectRel.objects.create(user=target_user, project=target_project)
3. 新建项目自动绑定创建者的实现
在DRF的视图层重写创建逻辑即可,默认取当前请求的登录用户和新建项目绑定:
from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from .models import Project from .serializers import ProjectSerializer class ProjectViewSet(viewsets.ModelViewSet): queryset = Project.objects.all() serializer_class = ProjectSerializer permission_classes = [IsAuthenticated] # 必须加登录校验,确保能拿到当前用户 def perform_create(self, serializer): # 先保存新建的项目对象 new_project = serializer.save() # 自动绑定当前登录用户 new_project.users.add(self.request.user)
如果使用自定义关联表,把绑定逻辑替换为创建关联条目即可:
def perform_create(self, serializer): new_project = serializer.save() UserProjectRel.objects.create(user=self.request.user, project=new_project)
内容的提问来源于stack exchange,提问作者Nic0lodeon
相关产品推荐
相关产品推荐

