在Django mod中将对象用作字段选择

2024-03-28 09:13:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何使用DjangoField.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。在后面的实现中,理论上我应该能够直接用strategy_field.do_somethingModel的对象调用strategy,但不幸的是,这个方法现在不起作用。问题是在实现中,还是通常不可能以这种方式使用选项?你知道吗


Tags: selfreturndefdescriptiondosomethingclasschoices
1条回答
网友
1楼 · 发布于 2024-03-28 09:13:12

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

解决方案是将此添加到模型中:

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

相关问题 更多 >