2016-05-26 12 views
0

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)?

+0

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

+0

Könnte auch eine Möglichkeit sein, aber ich wollte es ohne eigenes Modell ausprobieren. –

Antwort

1

Ich glaube, Sie würden besser definieren value und currency als Felder für das Modell, dann könnte man Methode des Modells haben Sie den Preis zu geben:

class MyModel(Model): 
    CURRENCIES = Choices(                                                       
     ('USD', 'US Dollars'),                                                      
     ('EUR', 'Euro'),                                                       
     ('GBP', 'British Pound'),                                                     
     ('AUD', 'Australian Dollar')) 

    value = fields.DecimalField() 
    currency = fields.CharField(max_length=4, choices=CURRENCIES) 

    def price_convertion(self, new_currency): 
     # take self.value and self.currency and convert it 
     # according to new_currency 

Oder Sie könnten Währung selbst ein Modell machen, wenn Sie wollen wirklich flexibel sein, aber die Klassenfunktion ist die gleiche:

+0

Ja, vielleicht ist das ein besserer Weg. Aber abgesehen davon, wie gut es ist, wie könnten Sie ein Objekt in einem Django-Modell speichern, ohne dafür ein eigenes Modell zu erstellen? Jetzt konzentriere ich mich mehr auf diese Frage.Aber auch danke für deine erste Antwort;) –

+0

Sorry, ich verstehe deine Frage nicht, wie du ein Objekt im Django-Modell speichern könntest, ohne ein eigenes Modell zu erstellen. Auf welchen Teil des Codes beziehen Sie sich? –

+0

Ich habe die Frage bearbeitet, dass es (hoffentlich) verständlich ist. –