2011-06-30 8 views
1

私のモデルの1つではかなり謎の問題があります。 ProgramMilestoneはMilestoneProgram間(through='...'を使用して)、リンカテーブルがあるDjango:モデル__init __()はすべての更新時に呼び出されます

class Program(models.Model) 
    ... 
    def __init__(self, *args, **kwargs): 
     super(Program, self).__init__(*args, **kwargs) 
     for m in Milestone.objects.all(): 
      try: 
       ProgramMilestone.objects.create(milestone = m, program = self) 
      except IntegrityError: # The link already exists. 
       pass 

を次のように私は__init__をオーバーライドしてきました。

私はすべてのMilestonesが唯一のプログラム作成時にProgramに追加するたいのですが、私もDjangoのadminインタフェースでプログラムを開くたびに、今、それはそれは不可能ジャンゴのあらゆるProgramMilestoneオブジェクトを削除すること(for m...ループを実行します管理者、リフレッシュ時に再作成されるため)。

__init__が誤解していますか?その場合、この動作(インスタンス化時にのみ実行されるワンオフコード)を作成するにはどうすればよいですか?

+0

Pythonでは、クラスのインスタンスが作成されるたびに__init__が呼び出されます。したがって、__init__は、プログラムの照会時および最初の作成時に呼び出されます。 –

答えて

8

私が正しくあなたを得たら、プログラムが作成されるときにいくつかのコードを実行したいと思う。

post_save信号を使用して、createdフラグを確認することができます。あなたのコードを有することにより

https://docs.djangoproject.com/en/dev/ref/signals/#post-save

は、その信号に耳を傾け、あなたは、プログラムが作成されるたびに、あなたのコードを実行し、変更することはできません。

+0

それは間違いなく、リンクのおかげで、私はそれをチェックアウトします。 '__init __()'が 'save()'のように呼び出されるのは標準的な動作ですか?それが '__init __()'がどのように振る舞うのであれば、違いは何ですか? –

+4

'__init __()'は、メモリ内のPythonオブジェクトをインスタンス化するたびに実行されるため、データベースからオブジェクトをロードしたり、新しいオブジェクトを作成したりするときに実行されます。既にオブジェクトがインスタンス化されている可能性があります)。 'save()'はまったく異なる、そしてDjango固有のメソッドです。 –

3

__init__メソッドは、メモリ内のProgramオブジェクトが作成されるたびに呼び出されます。これは、実際にディスク上に新しいプログラムオブジェクトを作成している時間と共に、データベースからプログラムを読み込むときに発生します。

+0

ああ、私は...私は '__init__'がメ​​モリ内オブジェクトの作成を参照しているとは考えていませんでした。ありがとう。 –

2

そのは、インスタンスです。インスタンス化は、Pythonオブジェクトが最初から作成されるか、データベースの値を使用して作成されるときです。

あなたは、おそらくsaveメソッドをオーバーライドしたい - あなたのバージョンでは、self.pkがNone場合、フラグが設定されている場合、あなたのコードを実行し、スーパークラスのsaveを呼び出してフラグを設定します。

関連する問題