2016-08-21 13 views
8


Ich habe ein Problem, einen Standardfeldwert festzulegen. Was ich machen will; was ich vorhabe zu tun?
Ich möchte diesen Preis in der Klasse Packages ein Standardwert von priceNoTax in der Klasse Bill sein. Wie Sie sehen können, sind alle drei Klassen logisch verbunden.
Beispiel: Konto 1 hat ein Paket mit der ID 1. Der Preis dieses Pakets ist 100. Der Standardwert von priceNoTax für Konto 1 ist 100.

Wie geht das? Ich bin relativ neu darin, also brauche ich Hilfe.
Django - Standardfeldwert hängt von anderem Feldwert ab

models.py

class Packages(models.Model): 
    #other fields 
    price = models.IntegerField(validators=[MinValueValidator(1)], verbose_name="Price of package") 

class Account(models.Model): 
    startDate = models.DateField(verbose_name="Start date") 
    finishDate = models.DateField(verbose_name="Finish date") 
    idPackage = models.ForeignKey(Packages, on_delete=models.CASCADE, verbose_name="Package") 

class Bill(models.Model): 
    date = models.DateField(default=datetime.now()) 
    tax = models.FloatField(default=0.20) 
    priceNoTax = models.IntegerField() 
    priceTax = models.FloatField(default=priceNoTax+(priceNoTax*tax)) 
    idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account") 

    def __str__(self): 
     return self.date 

Vielen Dank !!!

+0

Wie erhalten Sie die Informationen in das Modell? Verwenden Sie eine Admin-Seite oder geben Sie sie von einem anderen Ort aus ein? Es gibt mehrere Möglichkeiten, dies zu tun, aber keine, die das Standardattribut speziell auf den Wert eines anderen Modells setzen. –

+0

Sie brauchen die Felder 'priceNoTax' und' priceTax' nicht für mich, da sie * logisch bereits verbunden sind *. Sie können einfach von der 'Bill'-Klasse abfragen, wenn Sie als' Bill.objects.filter (idAccount__idPackage__price) 'auf Preise zugreifen möchten. Weniger doppelte Variablen –

Antwort

5

Fügen Sie das vielleicht Ihrer Bill-Klasse hinzu?

def save(self, *args, **kwargs): 
    if self.priceNoTax is None: 
     self.priceNoTax = self.idAccount.idPackage.price 
    super(Bill, self).save(*args, **kwargs) 
+0

Dies ist zum Speichern, nicht für den Standardwert – somenxavier

5

Warum brauchen Sie ein Feld? Sehen Sie einen Grund, warum jemand den Gesamtpreis ändern möchte, ohne den Preis und die Steuern auf die entsprechenden Werte zu ändern? Wenn es nicht wirklich ein Feld sein muss, können Sie es einfach zu einer Methode machen.

class Bill(models.Model): 
    date = models.DateField(default=datetime.now()) 
    tax = models.FloatField(default=0.20) 
    priceNoTax = models.IntegerField() 
    idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account") 

    def priceTax(self): 
     return self.priceNoTax + (self.priceNoTax*self.tax) 

    def __str__(self): 
     return self.date 

Sie können es immer noch die gleiche Art und Weise mit {{ bill.priceTax }} in Vorlagen verwenden. Im Code müssten Sie bill.priceTax() verwenden.

Auf diese Weise sollte der Preis mit Steuern auf dem neuesten Stand bleiben, egal wie sich die Steuer oder der Preis ohne Steuern ändert.

Sie können auch @property Dekorator verwenden, um zu vermeiden, dass Sie es als eine Funktion im Code aufrufen müssen.

@property 
def priceTax(self): 
    return self.priceNoTax + (self.priceNoTax*self.tax) 

mehr für https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods

-2

@kichik sehen beantwortet, wie der Standardwert unter Verwendung von Template-Tag anzuzeigen, und ich empfehle die automatische Berechnung von JavaScript zu implementieren.

Natürlich müssen Sie Benutzereingaben überprüfen oder save() Methode implementieren, wie @Chris Curvey sagte.

+0

Das Anzeigen der Informationen ist nicht das Problem. https://docs.djangoproject.com/de/2.0/ref/models/fields/#default Dies scheint die richtige Antwort zu sein. – wm3ndez

Verwandte Themen