将对象用作Django模型中的字段选择

时间:2018-11-17 23:54:13

标签: python django tuples

我正在尝试找出如何使用Django Field.choices作为策略选择器。

这是我要实现的目标的超简单示例:

class AbstractStrategy:
    description = str()

    def do_something(self):
        raise NotImplemented

    def __init__(self, description):
        self.symbol = description

    def __str__(self):
        return str(self.description)


class ABCStrategy(AbstractStrategy):
    def do_something(self):
        print('doing something abc way')
        return 


class XYZStrategy(AbstractStrategy):
    def do_something(self):
        print('doing something xyz way')
        return

ABC = ABCStrategy('ABC')
XYZ = XYZStrategy('XYZ')

STRATEGIES = (
(ABC, 'ABC'),
(XYZ, 'XYZ'),
)

然后将STRATEGIES用作choices=STRATEGIES。从理论上讲,稍后在实现中,我应该可以直接使用Modelstrategy_field.do_something的对象中调用策略,但是不幸的是,该方法暂时不起作用。是实施中的问题,还是通常无法通过这种方式使用选择?

1 个答案:

答案 0 :(得分:3)

选择的值将保存到数据库。该对象太复杂,无法序列化为字符串。

一种解决方案是将其添加到模型中:

STRATEGY_CHOICES = (
    ('ABC', 'ABC'),
    ...
)
strategy_mapping = {
    'ABC': ABCStrategy
}

strategy_id = models.CharField(
     choices=STRATEGY_CHOICES
)

@property
def strategy(self):
    return self.strategy_mapping[self.strategy_id]

然后您可以执行instance.strategy_id = 'ABC',使instance.strategyABCStrategy