[英]How Can I Associate A Foreign Key Of A Django Class Model Field To A Parent's Class Field
[英]Can a Django model field's default value be defined by a function dependent on a foreign parent model?
我試圖讓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 。 我從另一個答案中復制了一些東西,但在它沒有用之后放棄了。
如果這些都不起作用,我可以在視圖中創建每個報告之后再回復設置費用,但我寧願在創建報告時自動執行此操作,以獲得理智。
編輯:
結束#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()
您的最后一個示例可能適用於某些工作:
__init__
,而不是models.Model
-
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.