Python 可以将Django模型字段';是否由依赖于外部父模型的函数定义默认值?
我正试图使Python 可以将Django模型字段';是否由依赖于外部父模型的函数定义默认值?,python,django,django-models,Python,Django,Django Models,我正试图使报告的默认值的费用基于父模型的属性。我不想在save()中这样做,因为如果用户选择在保存前覆盖该值,则需要向用户显示该字段 除了只传递函数指针(即不传递())之外,以下是我尝试过的三种方法。运行python manage.py shell时会引发错误 #1 from django.db import models class Job(models.Model): veryImportant = models.IntegerField() def get_fee(sel
报告的默认值
的费用基于父模型的属性。我不想在save()
中这样做,因为如果用户选择在保存前覆盖该值,则需要向用户显示该字段
除了只传递函数指针(即不传递()
)之外,以下是我尝试过的三种方法。运行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。我从另一个答案中抄袭了一些东西,但没用就放弃了
如果这些都不起作用,在视图中创建每个报告后,我总是可以恢复到只设置费用的状态,但出于理智考虑,我宁愿在创建报告时自动设置费用
编辑:
最后使用了#3,修正了Yuji的答案,并进行了修改,以确保shell设置的任何可能的费用都会覆盖作业。get#fee()想要的费用
您的最后一个示例可能与某些工作配合使用:
\uuuu init\uuuu
,而不是models.Model
您好,我试图在我的例子中使用这个,但是我得到了
NameError:name'self'没有定义
我使用的模型几乎相同,我有两个属性number
和threshold
都是整数字段,我需要threshold
作为number
*50类级别(models.Model):group=models.ForeignKey(Level_group)number=models.IntegerField(unique=True)#null=True,blank=True threshold=models.IntegerField(null=False,blank=True)
不是一个好主意,因为不可能执行r=Report();r、 job=j1;r、 save()
我得到一个RelatedObjectsDoesNoteExist:报告没有作业错误。。。。您的报告模型如何知道您在初始化时引用的作业实例?
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()
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()