8

假设我有一个名为 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)
4

1 回答 1

18

如果“每次创建新的 Hero 对象”是指“每次在数据库中创建 Hero 记录”,那么不,您不想在__init__方法中执行此操作,因为任何时候都会调用 Hero对象是在 Python 中创建的,包括当您刚刚从数据库中获取现有记录时。

要执行您想要的操作,您可以使用 Django 的post_save 信号,检查信号回调中created关键字参数是否为 True,如果是,则执行您的“创建时”逻辑。

或者,在某些情况下更直接和自然,您可以重写 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.

于 2012-08-06T02:13:12.910 回答