2013-05-28 59 views
1

我很確定我的問題不清楚,但我不知道該怎麼做。創建基於模型的元素,同時創建另一個模型的元素?

事情是:我有一個Task模型,和一個TaskHistory模型。當我創建一個任務模型時,我想自動創建一個關聯的TaskHistory對象。 例如,我想在datetime.now()創建任務,值爲「榜樣」,而我這樣做時,將創建一個TaskHistory對象,具有

created_on = datetime.now() 
last_modification = datetime.now() 
old_value = "example" 
new_value = "example". 

我可以做,在模型領域我Task模型?

我對Django很新。

編輯:這兩個模型互相鏈接,我的TaskHistory對象將有task = Task如果它是這樣創建的。

回答

2

如果您指定的所有字段都在TaskHistory模型中可用,則可以覆蓋create()方法。

class Task(models.Model): 
    #other fields snipped for brevity 
    history = models.ForeignKey(TaskHistory) 

    @classmethod 
    def create(cls, *args, **kwargs): 
     task = cls(**kwargs) 
     history_kwargs = {'created_on':datetime.now(), 'last_modification':datetime.now(), 'old_value':'None', 'new_value': 'wee'} 
     history = TaskHistory(**history_kwargs) 
     history.save() 
     task.history = history 
     return task 

,並在您的視圖或你有什麼稱呼它

task = Task.create(insert_values_here_for_Task) 
task.save() 
+0

其實我並不清楚,但是這是contraty:在TaskHistory類中,我有task = models.ForeignKey(Task)。 但無論如何,理解這個過程,謝謝,看看我是否可以! – Nepho

+0

您可以通過刪除其中一個外鍵關係來簡化模型。 Django給你兩個對象之間的鏈接。 –

+0

好吧,我在我的TaskHistory類中刪除了task = models.ForeignKey(Task),並在我的Task類中放入了history = models.ForeignKey(TaskHistory),但是我有'undefined name'TaskHistory''的錯誤。做什麼 ? – Nepho

1

兩種方法可以做到這一點:

  1. 重寫你的任務模型save方法。
  2. 使用post_save信號。
+0

謝謝您的回答。我可以在我的Task類中做到這一點嗎? taskhistory = TaskHistory(任務=自我,字段= 「」,OLD_VALUE = 「剛纔創建的」 NEW_VALUE = 「剛剛創建」) \ n taskhistory.save() – Nepho

0

這是你如何使用signals做到這一點:

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from myapp.models import Task 

@receiver(post_save, sender=Task) 
def my_handler(sender, **kwargs): 
    task=sender 
    history_kwargs = {'created_on':datetime.now(), 'last_modification':datetime.now(), 'old_value':'None', 'new_value': 'wee'} 
    history = TaskHistory(**history_kwargs) 
    history.save() 
    task.history = history 
    task.save