django模型在创建时使用__init__?

Joe*_*oey 8 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)
Run Code Online (Sandbox Code Playgroud)

Gho*_*r21 18

如果通过"每次创建一个新的Hero对象",你的意思是"每次在数据库中创建一个Hero记录",那么不,你不想在__init__方法中这样做,因为这在任何时候被称为英雄object是在Python中创建的,包括从数据库中获取现有记录时.

要做你想做的事,你可以使用Django的post_save信号,检查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)
Run Code Online (Sandbox Code Playgroud)

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

  • 正如[文档解释](https://docs.djangoproject.com/en/1.4/topics/db/models/#overriding-model-methods),你应该总是包含`*args`和`**kwargs`调用父类的`save`方法,*ie*`super(Hero,self).save(*args,**kwargs)`.这样做的原因是为了防止将来(在Django或你的代码中)更改为`save()`方法的签名. (4认同)