在创建另一个模型的元素的同时,基于模型创建元素?

时间:2013-05-28 08:25:56

标签: django

我很确定我的问题不明确,但我不知道该怎么说。

问题是:我有一个Task模型和一个TaskHistory模型。当我创建一个Task模型时,我想自动创建一个关联的TaskHistory对象。 例如,我想在datetime.now()创建一个值为“example”的任务,当我这样做时,会创建一个TaskHistory对象,

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

我可以在Task模型的模型字段中执行此操作吗?

我是Django的新手。

编辑:这两个模型相互关联,如果TaskHistory对象创建的话,那么task = Task对象就会{{1}}。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

两种方法:

  1. 覆盖任务模型上的save方法。
  2. 使用post_save信号。

答案 2 :(得分: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