django模型在创建时使用__init__?

时间:2012-08-05 23:26:33

标签: django django-models

假设我有一个名为Hero的类,其名称为“name”。每次创建新的Hero对象时,我都想追加" is a hero"。我可以使用__init__吗?或者是否有我可以覆盖的django特定方法?

class Hero(modes.Model)
  name = models.CharField(max_length=100)
  def __init__(self, *args, **kwargs):
      name += " is a hero"
      super(Hero, self).__init__(*args, **kwargs)

1 个答案:

答案 0 :(得分:18)

如果通过“每次创建一个新的Hero对象”,你的意思是“每次在数据库中创建一个Hero记录”,那么不,你不想在__init__方法中这样做,因为只要在Python中创建Hero对象时就会调用它,包括刚刚从数据库中获取现有记录时。

要做你想做的事,你可以使用Django的post_save signal,检查created关键字参数为True的信号回调,如果是,则执行“on creation”逻辑。

或者,在某些情况下更直接和自然,您可以覆盖Hero的save()方法,如下所示:

def save(self, *args, **kwargs):
    if not self.pk:  # object is being created, thus no primary key field yet
       self.name += " is a hero"
    super(Hero, self).save(*args, **kwargs)

请注意,Djagno的bulk_create方法将跳过触发保存后信号或调用save