目前我想在我的django项目中使用Value Object Pattern。我有一个类Price
,就像这样:
class Price(object):
def __init__(self, value, currency):
self.value = value
self.currency = currency
现在我想在普通模型中使用这个类。问题很简单,我该如何在模型中使用它?什么类型的领域?
我最重要的要求是,我可以直接在模型实例上访问价格。所以我可以这样写:
item.price.in(Currency.EURO)
因此,如果我将价格作为JSON存储在数据库中,我不需要调用某些方法来调用例如反序列化。
感谢您的帮助!
修改
因为问题不够明确,我创建了一个更详细的描述:
我有一个普通的python类Price
(不是django模型!)
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
(django模型)中存储Item
(不是django模型)?
答案 0 :(得分:2)
我认为您最好将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)