Шаблон ValueObject в моделях Django

В настоящее время я хочу использовать шаблон Value Value в моем проекте django. У меня есть класс Price как это:

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

И теперь я хочу использовать этот класс в обычной модели. Вопрос прост, как мне использовать его в модели? Какой тип поля?

Мое самое важное требование заключается в том, чтобы я мог получить доступ к цене непосредственно на экземпляре модели. Чтобы я мог написать что-то вроде этого:

item.price.in(Currency.EURO)

Поэтому мне не нужно вызывать некоторые методы, например, для десериализации, если я сохраню цену в формате JSON в базе данных.

Спасибо за вашу помощь!

редактировать

Поскольку вопрос не был достаточно ясен, я создал более подробное описание:

У меня нормальный класс питона 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

Теперь я хочу иметь price в Item что я мог бы написать что-то вроде item.price.in(DOLLAR) или же item.price.in(EURO), Но я не хочу создавать два поля в Item как это:

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

Я тоже не хочу иметь ForeignKey в Price что мне нужно сделать класс Price подкласс models.Model,

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

Итак, вопрос в том, как я могу хранить Price (не модель Джанго) в Item (модель Джанго)?

1 ответ

Я думаю, вам лучше определить value а также currency в качестве полей для модели, вы можете использовать метод модели, который даст вам цену:

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)
Другие вопросы по тегам