gpt4 book ai didi

python - Django 模型字段的默认值可以由依赖于外部父模型的函数定义吗?

转载 作者:太空狗 更新时间:2023-10-29 21:44:24 25 4
gpt4 key购买 nike

我试图让 Report 费用的默认值基于父模型的属性。我不想在 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。我从另一个答案中复制了一些东西,但在它不起作用后放弃了。

如果这些都不起作用,我总是可以在 View 中创建每个报告后恢复为仅设置费用,但为了理智起见,我宁愿在创建报告时自动执行此操作。

编辑:

以#3 结束,修复了 Yuji 的答案并进行了修改以确保从 shell 设置的任何可能的费用覆盖 job.get_fee() 想要的。

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

最佳答案

您的最后一个示例可能适用于某些工作:

  1. 首先,您需要在您的类上__init__,而不是models.Model
  2. 您需要在模型初始化之后设置您的属性
  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()

关于python - Django 模型字段的默认值可以由依赖于外部父模型的函数定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com