Mongoengine 简明教程

MongoEngine - Signals

信号是由发送方对象发送的事件,任意数量的接收方对象可以订阅此类事件。信号接收方可以订阅特定的发送方,或者可以接收来自多个发送方的信号。

在 MongoEngine 中,信号处理由 blinker 库支持,这意味着你需要使用 pip 实用程序来安装它。mongoengine.signals 模块定义了以下信号 −

pre_init

在创建新的 Document 或 EmbeddedDocument 实例时调用,并在收集构造函数参数但尚未对其进行任何其他处理后执行。

post_init

在所有 Document 或 EmbeddedDocument 实例的处理完成后调用。

pre_save

在执行任何操作之前在 save() 中调用。

pre_save_post_validation

在 save() 中进行验证后但在保存之前调用。

post_save

在大多数操作(验证,插入/更新)成功完成后在 save() 中调用。传递一个附加的布尔关键字参数,以指明保存是插入还是更新。

pre_delete

在尝试执行删除操作之前在 delete() 中调用。

post_delete

在成功删除记录时在 delete() 中调用。

pre_bulk_insert

在验证要插入的文档后但在写入任何数据之前调用。

post_bulk_insert

在成功批量插入操作后调用。一个附加的布尔参数 loaded 将文档的内容标识为当 True 为 Document 实例或当 False 为已插入记录的主键值列表。

然后将事件处理程序函数附加到 Document 类。请注意, EmbeddedDocument 仅支持 pre/post_init 信号。pre/post_save 等只能附加到 Document 类。

你还可以使用装饰器快速创建多个信号并将它们作为类装饰器附加到 Document 或 EmbeddedDocument 子类。

在以下示例中,用作信号处理程序的演示,我们还使用 Python 的标准库模块——记录并设置记录级别以进行调试。

from mongoengine import *
from mongoengine import signals
import logging
logging.basicConfig(level=logging.DEBUG)

然后,我们编写一个文档类,以便在 newdb 数据库中创建相应的集合。在类中,定义了两个类的方法 pre_save() 和 post_save(),目的是在将文档保存在 Author 集合中之前和之后调用。

class Author(Document):
   name = StringField()

   def __unicode__(self):
      return self.name

   @classmethod
   def pre_save(cls, sender, document, **kwargs):
      logging.debug("Pre Save: %s" % document.name)

   @classmethod
   def post_save(cls, sender, document, **kwargs):
      logging.debug("Post Save: %s" % document.name)
      if 'created' in kwargs:
         if kwargs['created']:
            logging.debug("Created")
         else:
            logging.debug("Updated")

这两个类方法都被定义为带有 classname、发送者对象和带有可选关键字参数列表的文档的参数。

最后,我们注册信号处理程序。

signals.pre_save.connect(Author.pre_save, sender=Author)
signals.post_save.connect(Author.post_save, sender=Author)

当我们创建 Document 子类的实例时,控制台日志将显示由相应事件处理程序处理的 pre 和 post 保存信号。

Author(name="Lathkar").save()

Python 控制台按如下所示报告日志 −

DEBUG:root:Pre Save: Lathkar
DEBUG:root:Post Save: Lathkar
DEBUG:root:Created