2012-08-05 2 views
8

「名前」という名前のフィールドを持つHeroという名前のクラスがあるとします。新しいヒーローオブジェクトが作成されるたびに、" is a hero"を追加したいと思います。それには__init__を使用できますか?または、私はそれをオーバーライドすることができますジャンゴ固有のメソッドはありますか?djangoモデルを作成するには__init__を使用しますか?

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

@ IgnacioVazquez-Abrams私は 'Hero'クラスの集約入力に基づいて別のモデルを更新する必要があります。 – Joey

+1

@Joey代わりに[signals](https://docs.djangoproject.com/en/1.4/topics/signals/)を使用してください。 – Dougal

答えて

15

「新しいヒーローのオブジェクトが作成されるたびに」によって、あなたが意味する場合 「ヒーローレコードがデータベースに作成されるたびに、」その後、いや、あなたは__init__方法でこれを行うにはしたくありません、これは、データベースから既存のレコードを取得しているときを含め、PythonでHeroオブジェクトが作成されたときに呼び出されるためです。

Djangoのpost_save signalを使用して、信号コールバックでcreatedキーワードパラメータがTrueであることを確認し、「作成時」ロジックを実行することができます。 Djagnoのbulk_create方法は、ポストセーブ信号や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) 

注:

また

、および特定の場合には、より簡単で自然な、あなたは次のように英雄のsave()メソッドをオーバーライドすることができます。

+4

[docs explain](https://docs.djangoproject.com/en/1.4/topics/db/models/#overriding-model-methods)として、あなたは常に '* args'と' ** kwargs'を含めるべきです親クラスの 'save'メソッド、* ie *' super(Hero、self).save(* args、** kwargs) 'の呼び出しで呼び出されます。この理由は、 'save()'メソッドのシグネチャへの変更(Djangoまたはあなたのコード)に対する将来の保証にあります。 – supervacuo

+1

@supervacuo - 良いキャッチ、私はそれを編集しました、ありがとう。 – Ghopper21

+1

将来の読者のための警告として、 'save'をオーバーライドすることは普遍的に安全ではありません。 [バッチ保存は過負荷の保存メソッドを呼び出したり、 'post_save'と' pre_save'シグナルを呼び出すことはありません(https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods)。私はDjangoがバルクの更新や作成をカスタマイズする方法を提供しているかどうかは分かりませんが、それはそうではありませんので、あなたはこれをどうやって行うか慎重にしてください。カスタム更新の動作について – Taywee

関連する問題