【问题标题】:have multiple users as one model field in many to one format django models在多对一格式的 Django 模型中,将多个用户作为一个模型字段
【发布时间】:2026-01-05 03:50:02
【问题描述】:

我想创建一个极简的任务管理应用来学习 Django 的基础知识。所以会有 Projects 、 Tasks 和 Users 作为三大实体。

  • 一个项目可以有多个用户
  • 一个项目可以有多个任务
  • 一个任务可以分配给 1 个用户

我无法弄清楚如何从 Project 中进行多对一操作 -> 使用 django.contrib.auth.models.User 作为我的用户源的用户。

这是我目前所拥有的,但我知道这是错误的,我无法理解它。我试图与其他问题相关联,例如与参赛者有关的问题和与 * 上的漏洞 URLS 相关的问题。我不确定是否必须编写自己的用户模型,或者以某种方式扩展它。

class Project(models.Model):
    Project_Name = models.CharField(max_length=100)
    Project_Users = models.ManyToManyField(User)

class Tasks(models.Model):
    Task_Name = models.CharField(max_length=300)
    Task_AssignedToUser = models.ForeignKey("Project_Name", through=Users)

感谢您的帮助。

【问题讨论】:

    标签: python django model one-to-many


    【解决方案1】:
    class Project(models.Model):
        name = models.CharField(max_length=100)
        users = models.ManyToManyField(User)
    
    class Task(models.Model):
        project = models.ForeignKey(Project, related_name='project_tasks')
        name = models.CharField(max_length=300)
        assignee = models.ForeignKey(User, related_name='tasks')
    

    获取参与特定项目的用户:

    p = Project.objects.get(name='myproject')
    users = p.users.all()
    

    获取项目的任务:

    users = p.project_tasks.all()  # Because of `related_name` in Task.project
    

    获取所有项目中用户拥有的所有任务:

    u = User.objects.get(username='someuser')
    u.tasks.all()  # Because of `related_name` in Task.assignee
    

    注意事项:

    1. ForeignKey 是多对一关系。例如一个任务只属于一个项目 - 一个项目可以有多个任务。

    2. 您不需要多余的字段名称。 name优于Project_Name

    3. 一次一个问题。

    【讨论】:

    • 非常感谢。我也填写了你的三个笔记。这如何阻止我从 Django Admin 将一项任务分配给不在项目中的用户?
    • @kal 不要犹豫,要求澄清和/或针对个别问题发布更多问题。
    • @kal 它没有。您必须编写处理该问题的代码,因为这是一个business logic 问题,而不是可以在数据库级别强制执行的constraint
    最近更新 更多