2017-10-21 63 views
1

我試圖創建以下情形的典範項目:Django模型 - 創造出必須通過各種任務

的項目進行輸送,具有通過各種任務,按照一定的順序通過。 只要項目通過任務,該任務就被標記爲已完成。 任務的名稱是事先已知的。

例如:

  • 創建項目
  • 任務1 '註冊項目'
  • 任務2 '安裝項目'
  • 任務3 '檢查項目的日誌'

我從一個像這樣的簡單模型開始,b它對我來說看起來很靜,而不是我真正想要的。

models.py

class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    task1_name = models.CharField(max_length=128) 
    task1_done_by = models.CharField(max_length=64, blank=True) 
    task1_done_date = models.DateField(null=True, blank=True) 

    task2_name = models.CharField(max_length=128) 
    task2_done_by = models.CharField(max_length=64, blank=True) 
    task2_done_date = models.DateField(null=True, blank=True) 

    # ... next 20 tasks 

    def __str__(self): 
     return str(self.item_id) 

試圖關係領域,例如多對多字段預先定義的任務,我結束了這一點:

class Task(models.Model): 

    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 


class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 
    tasks = models.ManyToManyField(Task) 

但是,如果我創建了兩個項目進行相同的任務和第一項的任務標記爲完成它將被標記爲第二項中的完成 - 這不是我想要的。

如何將任務分配給特定項目?或者哪個其他模型最適合我的場景?

回答

1

爲了在創建對象時執行代碼,您通常會覆蓋save()方法。因此,一個項目被創建時,在save()方法創建和動態鏈接的任務Item.tasks

class Item(models.Model): 
    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    # remove m2m !!! 

    def save(self, *args, **kwargs): 
     # If it has no pk then it is a *new* item 
     if not self.pk: 

      # Save by manually 
      # Call save of parent class (models.Model) creating the custom class 
      super(Item, self).save(*args, **kwargs) 

      # Now you have the PK 
      t1 = Task(name='T1', item=self) 
      t1.save() 
      #... 

class Task(models.Model): 
    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 

    # Add Item FK 
    item = models.ForeignKey(Item) 

註上的代碼更新:

1)我改變了方向:任務鏈接到物品,而不是相反。見https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_one/

2)我仍然檢查它是否是一個新的實例,然後調用超級保存,然後我創建此項目的任務。

確保檢查self.pk值,否則在更新對象時也會執行代碼。

另外請注意,您必須每次創建一個鏈接到Item對象的新Task對象。如果您將一個任務對象鏈接到兩個項目,那麼當item_a完成一項任務時,該任務似乎也將爲item_b完成。

您需要做的是爲item_b創建item1的task1和item_b的task2。這樣你分開的任務。

往下看:

https://docs.djangoproject.com/en/1.11/ref/models/instances/#saving-objects

https://docs.djangoproject.com/en/1.11/topics/db/models/#relationships

+0

我已經調整了我的問題有點澄清我的問題:如果我創建兩個項目具有相同的任務和標記的第一項任務完成後,它會在第二項中標記爲已完成 - 這不是我想要的,我正在尋找解決方案。 –

+1

類Item(models.Models)是數據庫對象的模板。您可以從中創建實例。如果您將一個任務實例鏈接到兩個項目實例並更新任務,則鏈接到這兩個項目的鏈接將會相同。你需要做的是爲item1創建task1,爲item2創建task2。這樣你分開的任務。 – rollinger

+0

我開始明白了。我必須創建新任務並將其鏈接到每個新項目,並且不能重複使用它們。你碰巧有一個手動創建和添加任務的代碼示例嗎? –