跳转到主要内容

未提供项目描述

项目描述

一组有用的自定义字段,可用于使用Django模型实现策略模式

策略以标准选择字段的形式显示在SelectBoxes中

此软件包提供以下自定义字段

  • StrategyField

  • MultipleStrategyField

  • StrategyClassField

  • MultipleStrategyClassField

StrategyField可以像模型实例一样访问,它有一个指向“拥有”字段的模型(反向关系)的属性context。因此

示例

from strategy_field.fields import StrategyField
from django.core.mail.backends.filebased.EmailBackend


class Event(models.Model):
    backend = StrategyField()

Event(sender='django.core.mail.backends.filebased.EmailBackend')

用例

例如,我们可以想象一个管理需要通知用户的事件的应用程序。每个事件的每次发生都可以使用不同的传输方式(电子邮件、短信等)进行通知。我们希望能够通过Django管理面板简单地按事件添加/更改发送通知的方式。

from strategy_field.fields import StrategyField
from strategy_field.registry import Registry

class TransportRegistry(Registry)
    pass

class AbstractStrategy(object):
    def __init__(self, context):
        self.context = context

    def send(self):
        raise NotImplementedError

class EmailStrategy(AbstractTransport):
    def send(self):
        ...

class SMSStrategy(AbstractTransport):
    def send(self):
        ...
registry = TransportRegistry(AbstractStrategy)
registry.register(EmailStrategy)
registry.register(SMSStrategy)

class Event(models.Model):
    sender = StrategyField(registry=registry)

Event.objects.get_or_create(sender=EmailStrategy)
...
...
e = Event.objects.get(sender=EmailStrategy)
e.sender.send() # e.sender.context == e

更多示例

使用可调用函数

from strategy_field.fields import StrategyField
from strategy_field.registry import Registry

registry1 = Registry()
registry2 = Registry()

class A(model):
    sender = StrategyField(registry=lambda model: model._registry)
    class Meta:
        abstract = True

class C1(A):
    _registry = registry1
    class Meta:
        abstract = True

class C2(A):
    _registry = registry2
    class Meta:
        abstract = True

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

django-strategy-field-3.1.0.tar.gz (23.7 kB 查看哈希值)

上传时间

支持