Может ли значение по умолчанию для поля модели Django быть определено функцией, зависящей от внешней родительской модели?

Я пытаюсь получить значение по умолчанию Report Комиссия будет основана на атрибутах родительской модели. Я не хочу делать это в save () , потому что поле должно быть представлено пользователю, если он решит переопределить значение перед сохранением.

Вот три метода, которые я пробовал, помимо передачи только указателей на функции (т.е. без () ). Ошибки возникают, когда я запускаю оболочку python manage.py .

#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, исправил ответом Юджи и изменил, чтобы убедиться, что любая возможная плата, установленная из оболочки, переопределяет то, что хочет 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()
7
задан wizpig64 25 October 2011 в 22:48
поделиться