Kann ein Django model Standardwert des Feldes definiert werden, die durch eine Funktion abhängig von einem ausländischen Elternteil-Modell?

Ich bin versucht zu haben, der default-Wert von Report's-Gebühr basiert auf einem übergeordneten Modell der Attribute. Ich will nicht, dies zu tun in save(), denn das Feld muss dem Benutzer präsentiert werden, wenn Sie wählen, überschreiben Sie den Wert vor dem speichern.

Hier sind die drei Methoden die ich versucht habe, neben der Weitergabe nur Funktionszeiger (also ohne ()). Die Fehler werden ausgelöst, wenn ich laufen 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

Den Fehler mit #3 könnte sein, dass ich einfach keine Ahnung habe, wie das überschreiben init richtig. Kopiert habe ich etwas aus der anderen Antwort und gab nach, es hat nicht funktioniert.

Wenn keine dieser arbeiten wird, kann ich immer wieder nur die Einstellung der Gebühr, nachdem ich jeden Bericht in der Ansicht, aber ich würde lieber tun es automatisch, wenn der Bericht erstellt ist, für den Verstand zu verlieren.

EDIT:

Landete mit #3, fest mit Yuji ' s Antwort und modifiziert werden, um sicherzustellen, dass alle möglichen Gebühr von der shell überschreibt, was job.get_fee() will.

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()
InformationsquelleAutor wizpig64 | 2011-10-25
Schreibe einen Kommentar