簡體   English   中英

Django模型字段的默認值是否可以由依賴於外部父模型的函數定義?

[英]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()

您的最后一個示例可能適用於某些工作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM