django自定义字段实现策略模式
django-strategy-field的Python项目详细描述
用于用django模型实现Strategy Pattern的自定义字段集。
这些策略在选择框中显示为标准选择字段
此软件包提供以下自定义字段:
- 战略领域
- 多个字段
- 战略类字段
- 多个类别密码字段
StrategyField可以作为带有属性的模型的实例来访问 context指向“拥有”字段的模型(逆关系)。所以:
示例
fromstrategy_field.fieldsimportStrategyFieldfromdjango.core.mail.backends.filebased.EmailBackendclassEvent(models.Model):backend=StrategyField()Event(sender='django.core.mail.backends.filebased.EmailBackend')
用例
例如,我们可以想象一个管理需要通知用户的事件的应用程序。 可以使用不同的传输方式(电子邮件、短信等)通知事件的每个发生。 我们希望能够添加/更改发送通知的方式,基于每个事件,只需使用 Django管理面板。
fromstrategy_field.fieldsimportStrategyFieldfromstrategy_field.registryimportRegistryclassTransportRegistry(Registry)passclassAbstractStrategy(object):def__init__(self,context):self.context=contextdefsend(self):raiseNotImplementedErrorclassEmailStrategy(AbstractTransport):defsend(self):...classSMSStrategy(AbstractTransport):defsend(self):...registry=TransportRegistry(AbstractTransport)registry.register(EmailStrategy)registry.register(SMSStrategy)classEvent(models.Model):sender=StrategyField(registry)Event.objects.get_or_create(sender=EmailStrategy)......e=Event.objects.get(sender=EmailStrategy)e.sender.send()# e.sender.context == e
更多示例
使用可调用的
fromstrategy_field.fieldsimportStrategyFieldfromstrategy_field.registryimportRegistryregistry1=Registry()registry2=Registry()classA(model):sender=StrategyField(registry=lambdamodel:model._registry)classMeta:abstract=TrueclassC1(A):_registry=registry1classMeta:abstract=TrueclassC2(A):_registry=registry2classMeta:abstract=True
项目链接
Stable | |||
Development | |||
Project home page: | https://github.com/saxix/django-strategy-field | ||
Issue tracker: | https://github.com/saxix/django-strategy-field/issues?sort | ||
Download: | http://pypi.python.org/pypi/django-strategy-field/ |