親モデルの属性に基づいて、デフォルト値の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()
これは動作します。あなたの助けをありがとう! – wizpig64
いいえ問題:) –
こんにちは、私の場合はこれを使用しようとしていますが、 '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) ' –