django中的复杂模型关系

时间:2016-03-08 18:22:16

标签: sql django relationship

我的问题是如何更轻松地设计我的数据库方案?

我有三种模式:

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 个答案:

答案 0 :(得分:2)

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

  • 一对一关系:将关系状态移动到表格
  • 中的任何一个
  • 一对多关系:将关系状态移至多个实例的表
  • 多对多关系:创建一个新表,将主键作为两个表的主键组合,并将关系信息作为字段

答案 1 :(得分:2)

你的方法可能是一种方法,不要以为你可以避免额外的桌子。

您基本上是通过额外字段声明新的多对多关系,因此您可以将其声明为see docs

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