Derzeit möchte ich das Value-Objekt-Muster in meinem Django-Projekt verwenden. Ich habe eine Klasse Price
wie folgt aus:ValueObject-Muster in Django-Modellen
class Price(object):
def __init__(self, value, currency):
self.value = value
self.currency = currency
Und nun möchte ich diese Klasse in einem normalen Modell verwenden. Die Frage ist einfach, wie soll ich es im Modell verwenden? Welche Art von Feld?
Meine wichtigste Voraussetzung ist, dass ich direkt auf eine Instanz des Modells zugreifen kann. So, dass ich so etwas schreiben könnte:
item.price.in(Currency.EURO)
So muss ich nicht einige Methoden aufrufen, zum Beispiel Deserialisierung aufzurufen, wenn ich den Preis als JSON in der Datenbank speichern.
Danke für Ihre Hilfe!
bearbeiten
Weil die Frage nicht klar genug war, habe ich eine ausführlichere Beschreibung:
Ich habe eine normale Python-Klasse Price
class Price(object):
def __init__(self, value, currency):
self.value = value
self.currency = currency
(kein django Modell!)
Und dann habe ich ein Django-Modell Item
.
class Item(models.Model):
name = models.CharField(max_length=100)
# other not necessary fields
Jetzt möchte ich eine price
in Item
haben, die ich so etwas wie item.price.in(DOLLAR)
oder item.price.in(EURO)
schreiben konnte. Aber ich nicht wollen in Item
wie diese zwei Felder erstellen:
class Item(models.Model):
name = models.CharField(max_length=100)
price_value = models.FloatField()
price_currency = models.IntegerField(choices=Currency.CHOICES)
ich auch keine ForeignKey
-Price
haben wollen, die ich brauche die Klasse Price
eine Unterklasse von models.Model
zu machen .
class Item(models.Model):
name = models.CharField(max_length=100)
price = models.ForeignKey(Price)
Die Frage ist also, wie kann ich speichere ein Price
(keine django-Modell) im Item
(django-Modell)?
Sie beschreiben nicht im Wesentlichen eine viele zu viele Beziehung zwischen Artikel und Währung mit Preis als die mittlere Tabelle mit Wert und Währung die Fremdschlüssel? – nephlm
Könnte auch eine Möglichkeit sein, aber ich wollte es ohne eigenes Modell ausprobieren. –