Шаблон 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)