2012-04-16 10 views
1

新しいインスタンスを作成するときに、フィールドに使用するデフォルト値を返す呼び出し可能オブジェクトを作成しようとしています。Field.defaultのDjango呼び出し可能オブジェクトの作成

値のロジックは、モデル内の他のデータに依存します。私は別のクラスを作成しようとしましたが、適切な組み合わせの要素には当てられていません。例:models.pyで

Class Box(models.Model): 
    inv_id = models.CharField(max_length=16,default=gen_inv_id()) 

呼び出し可能オブジェクトは、データベースモデルを照会し、テーブル値をインクリメントする必要があります。私は、アプリケーションの下に別の.pyモジュールでクラスを作成しようとしましたが、値を返すメソッドが必要です。 OOはこの時点で私の強い訴訟ではありません。私はモデルが無効になったと思うし、方法はそれに依存するので、鶏肉/卵のシナリオが現れたようだ。

ありがとうございました。

答えて

0

これまでに私はこの問題に遭遇しました。まず、クラスのsaveメソッドを上書きして、計算を行うために必要なパラメータを保存してから、計算と再保存を行います。 saveメソッドを上書きする場合は、super.save()を呼び出す必要があります(正確な表記が何であるか忘れてしまいます)

編集:super.saveの表記はsuper(Model、self).save * args、** kwargs)

5

いつもの(1.0日前)デフォルトのキーワードは、呼び出し可能なコールバックをサポートしていました。あなたのコードの問題は、呼び出し可能(default=gen_inv_id)ではなく、呼び出し可能(default=gen_inv_id())の結果を渡すことです。

だから、あなたはおそらくやりたい:他のいくつかのコメントは `save`メソッドをオーバーライド言及し、それはないながら https://docs.djangoproject.com/en/1.4/ref/models/fields/#default

+0

Class Box(models.Model): inv_id = models.CharField(max_length=16,default=gen_inv_id) 

はこれを説明する最新バージョンのドキュメントをチェックアウト仕事、それはこれよりずっと面倒です。しかし、デフォルト値がオブジェクトインスタンスへのアクセスを必要とする場合(例えば、デフォルト値がそのモデルの他のフィールドに基づいている場合など)、 'save'メソッドをオーバーライドする必要があります。 –

+0

これは良い答えです。 デフォルトでフィールドを導入し、テーブルに既存の行がある移行を実行する場合は、注意が必要です。その場合、 'default'関数は一度だけ実行され、インスタンスが個別に保存される場合とは異なり、すべての行に同じ値が設定されます。 回避するには: なしでフィールドをnullableとして設定します。2.既存の行を移入するためにデータの移行を実行します。 3.デフォルトを設定し、フィールドをnullに設定できないように設定します。 – Geekfish

関連する問題