跳转到主要内容

为django模型实例提供订阅模型。

项目描述

PyPI Actions Status Documentation Status

Codacy Badge Codacy Badge codecov

Total alerts Language grade: Python PyPI - License

PyPI - Python Version PyPI - Django Version Downloads

django-model-subscription

Sreenshot

目录

动机

  • 使用观察者模式通知订阅者关于django模型更改。
  • 从模型的save方法解耦业务逻辑
  • 支持批量操作(使用django signals不可用)
  • 当settings.SUBSCRIPTION_RUN_EXTERNAL为False时使用no-op订阅者,这可以防止在测试、本地开发环境中模拟调用外部服务的订阅者。
  • 显示实例更新后的更改,即比较初始状态和当前状态。

Screenshot

安装

$ pip install django-model-subscription

model_subscription 添加到您的 INSTALLED_APPS 中

INSTALLED_APPS = [
    ...,
    'model_subscription',
    ...
]

用法

使用 SubscriptionModelMixinSubscriptionQuerySet
from model_subscription.mixin import SubscriptionModelMixin
from model_subscription.model import SubscriptionQuerySet


class TestModel(SubscriptionModelMixin, models.Model):
    name = models.CharField(max_length=255)

    objects = SubscriptionQuerySet.as_manager()
SubscriptionModel 基类派生。
from model_subscription.model import SubscriptionModel


class TestModel(SubscriptionModel):
    name = models.CharField(max_length=255)

创建订阅者。

  • 使用 OperationType
import logging
from model_subscription.decorators import subscribe
from model_subscription.constants import OperationType

log = logging.getLogger(__name__)

@subscribe(OperationType.CREATE, TestModel)
def handle_create(instance):
    log.debug('Created {}'.format(instance.name))
  • 直接使用 create_subscription(简洁版本)。
import logging
from model_subscription.decorators import create_subscription

log = logging.getLogger(__name__)

@create_subscription(TestModel)
def handle_create(instance):
    log.debug('Created {}'.format(instance.name))

装饰器

  • subscribe:显式(需要有效的 OperationType)。

(创建、更新、删除)操作。

  • create_subscription:订阅创建操作,即新实例。
@create_subscription(TestModel)
def handle_create(instance):
    log.debug('1. Created {}'.format(instance.name))
  • update_subscription:订阅更新,还包括(changed_data)。
@update_subscription(TestModel)
def handle_update(instance, changed_data):
    log.debug('Updated {} {}'.format(instance.name, changed_data))
  • delete_subscription:订阅删除操作

注意:实例的 pk 已经设置为 None。

@delete_subscription(TestModel)
def handle_delete(instance):
    log.debug('Deleted {}'.format(instance.name))

(批量创建、批量更新、批量删除)操作。

  • bulk_create_subscription:订阅批量创建操作。
@bulk_create_subscription(TestModel)
def handle_bulk_create(instances):
    for instance in instances:
        log.debug('Bulk Created {}'.format(instance.name))
  • bulk_update_subscription:订阅批量更新操作。
@bulk_update_subscription(TestModel)
def handle_bulk_update(instances):
    for instance in instances:
        log.debug('Updated {}'.format(instance.name))
  • bulk_delete_subscription:订阅批量删除操作。
@bulk_delete_subscription(TestModel)
def handle_bulk_delete(instances):
    for instance in instances:
        log.debug('Deleted {}'.format(instance.name))

使用 AppConfig.ready 设置订阅者(推荐)。

更新您的 apps.py

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        from myapp import subscriptions

使用自动发现设置订阅者。

默认情况下,settings.SUBSCRIPTION_AUTO_DISCOVER 设置为 False

为了使用自动发现,这不建议,因为它会在模型使用的任何地方通知订阅者,例如 IPython 笔记本、外部脚本。

在您的 settings.py 中添加

SUBSCRIPTION_AUTO_DISCOVER = True

设置 SUBSCRIPTION_MODULE

注意:仅在 SUBSCRIPTION_AUTO_DISCOVER = True 时需要。

SUBSCRIPTION_MODULE  = 'subscription'

致谢

如果您慷慨并想表示额外的感激之情

Buy me a coffee

资源

待办事项

  • 支持字段级别订阅。
  • 支持基于类的订阅者,实现 __call__
  • 扩展以包括自定义 OperationType。
  • 添加对使用单个类管理多个操作的支持,例如 MyClass.update、MyClass.create。

项目详情


下载文件

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

源分发

django-model-subscription-0.2.2.tar.gz (13.3 kB 查看散列)

上传时间

构建分发

django_model_subscription-0.2.2-py3-none-any.whl (12.5 kB 查看散列)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页