2016-03-08 126 views
2

我的问题是我如何设计我的数据库方案更容易?django中的复杂模型关系

我有三个型号:

class Project(models.Model): 
    name = models.CharField('Name') 
    tasklists = models.ManyToManyField(Tasklist) 

class Tasklist(models.Model): 
    name = models.CharField('Name') 

class Task(models.Model): 
    name = models.TextField('Name') 
    tasklist = models.ForeignKey(Tasklist) 

所以,想法是,我有一个项目,可能有很多的任务列表(以及每个任务列表中可能有几个任务)。此外,同一个任务列表可能涉及具有相同任务的多个项目。

但我需要的是保存一个特定项目的任务状态。所以,假设我有两个项目,它们具有两个任务的基本任务列表,但是在第一个项目中,我已经完成了所有任务,但没有完成任务。我应该在哪里存储每个项目特定的任务状态? 感谢您的帮助!

项目1 - >基本任务列表 - >任务1(完成)任务2(完成)
项目2 - >基本任务列表 - >任务1(活性)任务2(活性)

我的猜测是创建另一个模型,如下所示:

class TaskState(models.Model): 
    task = models.ForeignKey(Task) 
    project = models.ForeignKey(Project) 
    done = models.BooleanField(default=False) 

回答

2

您的方法可能是一种方法,不要以为您可以避免多余的表。

你基本上宣告一个额外的领域新的许多一对多的关系,所以你可以声明它是这样,see docs

class Project(models.Model): 
    task_states = models.ManyToManyField(Task, through='TaskState') 
+0

谢谢!添加这个额外的字段确实简化了查询。 – v01d

2

这里您要保存多对多数据库的关系状态。这是一本教科书的案例,您的解决方案是处理此类情况的最佳方法。这将允许您将来有与此关系相对应的其他字段。以下是标准的做法,以记录关系状态:

  • 以一对一的关系:将关系状态设置为表
  • 一对多关系:将关系状态的多个实例表
  • 多对多关系:创建一个新表具有主键作为两个表的主键的组合,并具有关系信息作为字段