django模型中的ValueObject模式

时间:2016-05-26 18:39:19

标签: python django design-patterns django-models value-objects

目前我想在我的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)

想要ForeignKeyPrice我需要让Price成为models.Model的子类

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

所以问题是,如何在Price(django模型)中存储Item(不是django模型)?

1 个答案:

答案 0 :(得分:2)

我认为您最好将valuecurrency定义为模型的字段,然后您可以使用模型的方法为您提供价格:

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)