2016-03-08 163 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

這裏您要保存多對多數據庫的關係狀態。這是一本教科書的案例,您的解決方案是處理此類情況的最佳方法。這將允許您將來有與此關係相對應的其他字段。以下是標準的做法,以記錄關係狀態:

  • 以一對一的關係:將關係狀態設置爲表
  • 一對多關係:將關係狀態的多個實例表
  • 多對多關係:創建一個新表具有主鍵作爲兩個表的主鍵的組合,並具有關係信息作爲字段