2011-10-25 11 views
7

親モデルの属性に基づいて、デフォルト値のReportの料金を設定しようとしています。私はsave()でこれをしたくありません。保存する前に値を上書きすることを選択した場合、フィールドをユーザーに提示する必要があるためです。Djangoモデルフィールドのデフォルト値は、外部親モデルに依存する関数によって定義できますか?

私が試した3つの方法は、関数ポインタのみを渡すことに加えて(()なし)です。 python manage.py shellを実行するとエラーが発生します。

#1 
from django.db import models 

class Job(models.Model): 
    veryImportant = models.IntegerField() 
    def get_fee(self): 
     return 2 * self.veryImportant 

class Report(models.Model): 
    job = models.ForeignKey(Job) 
    overridableFee = models.DecimalField(default=job.get_fee(), max_digits=7, decimal_places=2) 

#gives... 
#AttributeError: 'ForeignKey' object has no attribute 'get_fee' 

#2 
from django.db import models 

class Job(models.Model): 
    veryImportant = models.IntegerField() 

class Report(models.Model): 
    job = models.ForeignKey(Job) 
    overridableFee = models.DecimalField(default=self.set_fee(), max_digits=7, decimal_places=2) 
    def set_fee(self): 
     overridableFee = 2 * self.job.veryImportant 

#gives... 
#NameError: name 'self' is not defined 

#3 
from django.db import models 

class Job(models.Model): 
    veryImportant = models.IntegerField() 
    def get_fee(): 
     return 2 * veryImportant 

class Report(models.Model): 
    job = models.ForeignKey(Job) 
    overridableFee = models.DecimalField(max_digits=7, decimal_places=2) 
    def __init__(self, *args, **kwargs): 
     self.overridableFee = self.job.get_fee() 
     super(models.Model, self).__init__(*args, **kwargs) 

#gives... 
#TypeError: object.__init__() takes no parameters 

#3との誤差は、私はちょうど適切のinitを無効にする方法が分からないということである可能性があります。私は別の答えから何かをコピーし、それがうまくいかないとあきらめました。

これらのどれもうまくいかない場合は、ビューで各レポートを作成した後はいつでも料金を設定するだけに戻すことができますが、レポートが作成されると自動的にそれを行います。

EDIT:

は雄二の答えで固定し、シェルのオーバーライド何job.get_fee(から設定されたすべての可能な料金を確認するために変更され、#3と一緒に行くことになった)望んでいます。

def __init__(self, *args, **kwargs): 
    super(Report, self).__init__(*args, **kwargs) 
    if self.overridableFee == None and self.job and not self.pk: 
     self.overridableFee = self.job.get_fee() 

答えて

7

あなたの最後の例では、潜在的にいくつかの作業で仕事ができる:

  1. まず、あなたはあなたが後にモデルをお使いの属性を設定する必要がありmodels.Model
  2. 、あなたのクラスに__init__にする必要はありません
  3. モデルが保存されているかどうかを確認する必要があります。そうしないと、モデルを読み込むたびに上書き可能な料金に戻ります。

-

class Job(models.Model): 
    veryImportant = models.IntegerField() 
    def get_fee(): 
     return 2 * veryImportant 

class Report(models.Model): 
    job = models.ForeignKey(Job) 
    overridableFee = models.DecimalField(max_digits=7, decimal_places=2) 
    def __init__(self, *args, **kwargs): 
     super(Report, self).__init__(*args, **kwargs) 
     if not self.id: 
      self.overridableFee = self.job.get_fee() 
+0

これは動作します。あなたの助けをありがとう! – wizpig64

+0

いいえ問題:) –

+0

こんにちは、私の場合はこれを使用しようとしていますが、 'NameError:name 'self'が定義されていません'私はほぼ同じモデルを使用しています。 'の両方が私が' number' * 50 'クラスレベル(models.Model)と' threshold'を必要IntegerFieldsは、次のとおり \t基=一意models.ForeignKey(Level_Group) \t数= models.IntegerField( = true)#null = True、空白= True \t threshold = models.IntegerField(null = False、blank = True) ' –