2016-06-20 4 views
2

Ich habe die folgende Model-Klasse, die meine Vermögenswerte einschließlich der Kosten darstellt.Wie überschreibe ich die __str __() -Methode eines einzelnen Feldes, ohne eine Knoten-ModelField-Klasse zu erstellen?

class Asset(models.Model): 
    name = models.CharField(max_length=64) 
    cost = models.DecimalField(max_digits=12, decimal_places=2, default=0.00) 

    def __str__(self): 
     return self.name 

Gibt es eine Möglichkeit, die __str__() Methode von Asset.cost außer Kraft zu setzen?

Mein Ziel ist es, die Ausgabe von cost mit dem Währungssymbol unter Beibehaltung der Eigenschaften einer ganzen Zahl zu haben.

Beispiele:

obj.cost = 10.00 

print(obj.cost) # should return $10.00 
print(obj.cost + 10) # should still be possible 
        # and should return 20.00 (without currency symbol, 
        #       because it is a regular integer now) 
+0

Beachten Sie, dass 'obj.cost' nur eine [Decimal'] (https://docs.python.org/3/library/decimal.html#decimal.Decimal) Instanz ist. Es ist nicht ratsam, die Methode "__str__" in der eingebauten Klasse "Decimal" zu überschreiben. Sie können eine Dienstprogrammfunktion verwenden, um die Dezimalstelle mit einem Währungssymbol zu drucken. – knbk

Antwort

1

Es ist offenbar nicht möglich. __str__ ist die Methode, die zur Klasse Asset gehört, aber wenn Sie object.cost drucken möchten, haben Sie versucht, die Zeichenfolgendarstellung des Feldscost anzuzeigen. __str__ kann nur die Ausgabe von Objekten des Modells Asset betreffen, nicht jedoch einzelne Felder.

Zweitens object.cost + 10 nicht fügen 10-object.cost, waren Sie gerade das Ergebnis von zwei Integer-Additionen Druck, aber du hast nicht das Ergebnis einer Variablen speichern noch zugewiesen object.cost, so kann __str__ nichts tun.

Sie benötigen eine util-Funktion, um dies zu tun, was ich für eine Art trivial halte. Diese Funktion sollte in der Klasse Asset liegen, es sei denn, Sie haben andere Situationen, um Währungen zu drucken. In diesen Fällen sollte das Util eine unabhängige Funktion sein.

0

Sie können eine Methode display_cost definieren, die Sie dann aufrufen können, wenn Sie das vorangehende Dollarzeichen benötigen.

def display_cost(self): 
    return "${amount}".format(amount=self.cost) 


obj.cost = 10.00 
obj.save() 
obj.display_cost() # >> "$10.00" 

diese Weise können Sie immer noch die Eigenschaften einer ganzen Zahl bewahren würde durch nicht Ihre Asset.cost Feld zu ändern, sondern eine Funktion, es zu wickeln, wenn Sie benötigen.

Verwandte Themen