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()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deinem letzten Beispiel könnte möglicherweise die Arbeit mit der Arbeit:
__init__
auf Ihre Klasse, nichtmodels.Model
-
NameError: name 'self' is not defined
ich benutze fast die gleichen Modelle, ich habe 2 Attributenumber
undthreshold
beide sind IntegerFields wo muss ich diethreshold
werden dienumber
*50class Level(models.Model): group = models.ForeignKey(Level_Group) number = models.IntegerField(unique=True)#null=True, blank=True threshold = models.IntegerField(null=False,blank=True)
r = Report(); r.job = j1; r.save()