8

「name」という名前のフィールドを持つ Hero という名前のクラスがあるとします。新しい 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

__init__「新しい Hero オブジェクトが作成されるたび」とは、「データベースで Hero レコードが作成されるたび」を意味する場合、いいえ、メソッドでこれを実行したくありません。オブジェクトは、データベースから既存のレコードを取得する場合を含め、Python で作成されます。

必要なことを行うには、Django のpost_save シグナルを使用して、シグナル コールバックでcreatedキーワード パラメータが True であることを確認し、そうであれば「作成時」ロジックを実行します。

または、場合によってはより単純で自然なsave()方法として、次のように Hero のメソッドをオーバーライドできます。

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 に答える