我正在尝试找出如何使用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
。从理论上讲,稍后在实现中,我应该可以直接使用Model
从strategy_field.do_something
的对象中调用策略,但是不幸的是,该方法暂时不起作用。是实施中的问题,还是通常无法通过这种方式使用选择?
答案 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.strategy
为ABCStrategy