Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可以将Django模型字段';是否由依赖于外部父模型的函数定义默认值?_Python_Django_Django Models - Fatal编程技术网

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()