0

現在、私はdjangoプロジェクトでバリューオブジェクトパターンを使用したいと考えています。私はこのようなクラスPriceを持っている:djangoモデルのValueObjectパターン

class Price(object): 
    def __init__(self, value, currency): 
     self.value = value 
     self.currency = currency 

そして今、私は、通常のモデルでこのクラスを使用します。質問は簡単ですが、モデルでどのように使うべきですか?どんなタイプのフィールドですか?

私の最も重要な要件は、私がモデルのインスタンスで直接価格にアクセスできることです。私はこのような何かを書くことができるように:

item.price.in(Currency.EURO) 

は、だから、私は、データベースにJSONとして価格を格納する場合、例えば、デシリアライズのために呼び出すために、いくつかのメソッドを呼び出す必要はありません。

ありがとうございました!

編集

質問が十分に明確ではなかった、私はより詳細な説明を作成したので:(!ないDjangoのモデル)

私は、通常のPythonのクラスPriceを持って

class Price(object): 
    def __init__(self, value, currency): 
     self.value = value 
     self.currency = currency 

そして私はdjangoモデルItemを持っています。

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    # other not necessary fields 

は今、私はitem.price.in(DOLLAR)またはitem.price.in(EURO)ような何かを書くことができItempriceを持っていると思います。私もが、私はクラスPricemodels.Modelのサブクラスを作成する必要がありForeignKeyPriceへの持っている必要はありません

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    price_value = models.FloatField() 
    price_currency = models.IntegerField(choices=Currency.CHOICES) 

:しかし、私はこのようなItemに2つのフィールドを作成したくないん

class Item(models.Model): name = models.CharField(max_length=100) price = models.ForeignKey(Price) 

は、そこで問題は、どのように私はItem(Djangoのモデル)でPrice(ないDjangoのモデル)を保存することができますか?

私はあなたがより良い、あなたはあなたの価格を与えるために、モデルのメソッドを持つことができ、モデルのフィールドとしてvaluecurrencyを定義すると思う
+0

:あなたは本当に柔軟になりたいが、クラスの機能は同じですか? – nephlm

+0

可能性もありますが、私はそれ自身のモデルなしで試してみたかったのです。 –

答えて

1

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 

それとも、通貨自体のモデルであれば作ることができますではないあなたは、本質的価値と通貨外部キーを持つ中央のテーブルとして価格でアイテムや通貨間の多くの関係に多くを記述している

class Currency(Model): 
    name = fields.CharField(max_length=4) 

class MyModel(Model): 
    currency = fields.ForeignKey(Currency) 
+0

はい、それはもっと良い方法かもしれません。しかし、それがどれほど優れているかを除けば、オブジェクトを独自のモデルを作成せずに、どのようにしてオブジェクトをジャンゴモデルに格納できますか?今私はその質問にもっと集中しています。しかし、最初の答えにもお返事ありがとうございます;) –

+0

申し訳ありませんあなたの質問 'どのようにあなた自身のモデルを作成せずにオブジェクトをdjangoモデルに格納することができます'を理解していない。コードのどの部分を参照していますか? –

+0

私は質問を編集しました、それは(うまくいけば)分かりました。 –