信号

Django 发送的所有信号列表。所有内置信号都使用send()方法发送。

另见

有关如何注册和接收信号的信息,请参阅有关信号分发器的文档。

身份验证框架会在用户登录/注销时发送信号

模型信号

django.db.models.signals模块定义了一组由模型系统发送的信号。

警告

信号可能会使您的代码难以维护。考虑在自定义管理器上实现一个辅助方法,以同时更新您的模型并执行其他逻辑,或者在使用模型信号之前重写模型方法

警告

许多这些信号是由各种模型方法(如__init__()save())发送的,您可以在自己的代码中重写这些方法。

如果重写模型上的这些方法,则必须调用父类的这些方法才能发送这些信号。

还要注意,Django 默认情况下将信号处理程序存储为弱引用,因此如果您的处理程序是局部函数,它可能会被垃圾回收。为了防止这种情况,在调用信号的connect()时,传递weak=False

注意

连接接收器时,可以延迟引用模型信号sender模型,方法是指定其完整的应用程序标签。例如,在polls应用程序中定义的Question模型可以引用为'polls.Question'。在处理循环导入依赖项和可交换模型时,这种类型的引用非常方便。

pre_init

django.db.models.signals.pre_init

每当实例化 Django 模型时,都会在模型的__init__()方法开始时发送此信号。

随此信号发送的参数

sender

刚刚创建实例的模型类。

args

传递给__init__()的位置参数列表。

kwargs

传递给__init__()的关键字参数字典。

例如,教程包含以下行

q = Question(question_text="What's new?", pub_date=timezone.now())

发送到pre_init处理程序的参数将是

参数

sender

Question(类本身)

args

[](空列表,因为没有位置参数传递给__init__()

kwargs

{'question_text': "What's new?", 'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)}

post_init

django.db.models.signals.post_init

与pre_init类似,但此信号在__init__()方法完成时发送。

随此信号发送的参数

sender

如上所述:刚刚创建实例的模型类。

instance

刚刚创建的模型的实际实例。

注意

发送post_init信号之前不会设置instance._state,因此_state属性始终具有其默认值。例如,_state.dbNone

警告

出于性能原因,不应在pre_initpost_init信号的接收器中执行查询,因为它们将在查询集迭代期间返回的每个实例中执行。

pre_save

django.db.models.signals.pre_save

这在模型的save()方法开始时发送。

随此信号发送的参数

sender

模型类。

instance

正在保存的实际实例。

raw

布尔值;如果模型按原样保存(即加载fixture时),则为True。由于数据库可能尚未处于一致状态,因此不应查询/修改数据库中的其他记录。

using

正在使用的数据库别名。

update_fields

要更新的字段集,如传递给Model.save(),或者如果update_fields没有传递给save(),则为None

post_save

django.db.models.signals.post_save

pre_save类似,但在save()方法结束时发送。

随此信号发送的参数

sender

模型类。

instance

正在保存的实际实例。

created

布尔值;如果创建了新记录,则为True

raw

布尔值;如果模型按原样保存(即加载fixture时),则为True。由于数据库可能尚未处于一致状态,因此不应查询/修改数据库中的其他记录。

using

正在使用的数据库别名。

update_fields

要更新的字段集,如传递给Model.save(),或者如果update_fields没有传递给save(),则为None

pre_delete

django.db.models.signals.pre_delete

在模型的delete()方法和查询集的delete()方法开始时发送。

随此信号发送的参数

sender

模型类。

instance

正在删除的实际实例。

using

正在使用的数据库别名。

origin

删除的来源是ModelQuerySet类的实例。

post_delete

django.db.models.signals.post_delete

pre_delete类似,但在模型的delete()方法和查询集的delete()方法结束时发送。

随此信号发送的参数

sender

模型类。

instance

正在删除的实际实例。

请注意,该对象将不再位于数据库中,因此请非常小心处理此实例。

using

正在使用的数据库别名。

origin

删除的来源是ModelQuerySet类的实例。

m2m_changed

django.db.models.signals.m2m_changed

当模型实例上的ManyToManyField发生更改时发送。严格来说,这并不是一个模型信号,因为它是由ManyToManyField发送的,但因为它补充了pre_save/post_savepre_delete/post_delete,在跟踪模型更改方面,它包含在此处。

随此信号发送的参数

sender

描述ManyToManyField的中间模型类。定义多对多字段时会自动创建此类;可以使用多对多字段上的through属性访问它。

instance

其多对多关系被更新的实例。这可以是sender的实例,也可以是ManyToManyField所关联的类的实例。

action

指示对关系所做的更新类型的字符串。可以是以下之一:

"pre_add"

在将一个或多个对象添加到关系之前发送。

"post_add"

在将一个或多个对象添加到关系之后发送。

"pre_remove"

在从关系中删除一个或多个对象之前发送。

"post_remove"

在从关系中删除一个或多个对象之后发送。

"pre_clear"

在关系被清除之前发送。

"post_clear"

在关系被清除之后发送。

reverse

指示更新关系的哪一侧(即,正在修改的是正向关系还是反向关系)。

model

添加到、从关系中删除或从关系中清除的对象的类。

pk_set

对于pre_addpost_add操作,这是一个主键值的集合,这些值将被添加到或已添加到关系中。这可能是提交要添加的值的子集,因为插入必须过滤现有值以避免数据库IntegrityError

对于pre_removepost_remove操作,这是一个主键值的集合,这些值已提交要从关系中删除。这并不取决于这些值是否实际将被删除或已被删除。特别是,可能会提交不存在的值,并且即使它们对数据库没有影响,也会出现在pk_set中。

对于pre_clearpost_clear操作,这是None

using

正在使用的数据库别名。

例如,如果一个Pizza可以有多个Topping对象,则可以这样建模:

class Topping(models.Model):
    # ...
    pass


class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

如果我们这样连接一个处理程序:

from django.db.models.signals import m2m_changed


def toppings_changed(sender, **kwargs):
    # Do something
    pass


m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)

然后执行类似这样的操作:

>>> p = Pizza.objects.create(...)
>>> t = Topping.objects.create(...)
>>> p.toppings.add(t)

发送到m2m_changed处理程序(在上面的示例中为toppings_changed)的参数将是:

参数

sender

Pizza.toppings.through(中间m2m类)

instance

p(正在修改的Pizza实例)

action

"pre_add"(随后是一个带有"post_add"的单独信号)

reverse

FalsePizza包含ManyToManyField,因此此调用修改正向关系)

model

Topping(添加到Pizza的对象的类)

pk_set

{t.id}(因为只有Topping t添加到关系中)

using

"default"(因为默认路由器在此处发送写入)

如果我们然后执行类似这样的操作:

>>> t.pizza_set.remove(p)

发送到m2m_changed处理程序的参数将是:

参数

sender

Pizza.toppings.through(中间m2m类)

instance

t(正在修改的Topping实例)

action

"pre_remove"(随后是一个带有"post_remove"的单独信号)

reverse

TruePizza包含ManyToManyField,因此此调用修改反向关系)

model

Pizza(从Topping中删除的对象的类)

pk_set

{p.id}(因为只有Pizza p从关系中删除)

using

"default"(因为默认路由器在此处发送写入)

class_prepared

django.db.models.signals.class_prepared

每当模型类被“准备”时发送——也就是说,一旦模型被定义并注册到Django的模型系统中。Django在内部使用此信号;它通常不用于第三方应用程序。

由于此信号是在应用程序注册表填充过程中发送的,并且AppConfig.ready()在应用程序注册表完全填充后运行,因此接收器不能在此方法中连接。一种可能性是在AppConfig.__init__()中连接它们,注意不要导入模型或触发对应用程序注册表的调用。

此信号发送的参数

sender

刚刚准备好的模型类。

管理信号

django-admin发送的信号。

pre_migrate

django.db.models.signals.pre_migrate

migrate命令在它开始安装应用程序之前发送。对于缺少models模块的应用程序,它不会发出。

随此信号发送的参数

sender

即将迁移/同步的应用程序的AppConfig实例。

app_config

sender相同。

verbosity

指示manage.py在屏幕上打印多少信息。详情请参阅--verbosity标志。

侦听pre_migrate的函数应根据此参数的值调整它们在屏幕上输出的内容。

interactive

如果interactiveTrue,则可以安全地提示用户在命令行输入内容。如果interactiveFalse,则侦听此信号的函数不应尝试提示任何内容。

例如,只有当interactiveTrue 时,django.contrib.auth 应用才会提示创建超级用户。

标准输出 (stdout)

一个类似流的对象,详细输出应重定向到此处。

using

命令将操作的数据库别名。

迁移计划 (plan)

将用于迁移运行的迁移计划。虽然计划不是公共 API,但这允许在需要了解计划的罕见情况下使用。计划是一个 2 元组列表,第一个元素是迁移类的实例,第二个元素表示迁移是否回滚了(True)或应用了(False)。

应用 (apps)

一个Apps 实例,包含迁移运行之前项目的运行状态。它应该代替全局 apps 注册表来检索要对其执行操作的模型。

post_migrate

django.db.models.signals.post_migrate

migrate(即使没有运行迁移)和 flush 命令结束时发送。对于缺少 models 模块的应用程序,它不会发出。

此信号的处理程序不得执行数据库模式更改,因为这样做可能会导致 flush 命令在 migrate 命令期间运行时失败。

随此信号发送的参数

sender

刚安装的应用程序的 AppConfig 实例。

app_config

sender相同。

verbosity

指示manage.py在屏幕上打印多少信息。详情请参阅--verbosity标志。

侦听 post_migrate 的函数应根据此参数的值调整它们向屏幕输出的内容。

interactive

如果interactiveTrue,则可以安全地提示用户在命令行输入内容。如果interactiveFalse,则侦听此信号的函数不应尝试提示任何内容。

例如,只有当interactiveTrue 时,django.contrib.auth 应用才会提示创建超级用户。

标准输出 (stdout)

一个类似流的对象,详细输出应重定向到此处。

using

用于同步的数据库别名。默认为 default 数据库。

迁移计划 (plan)

用于迁移运行的迁移计划。虽然计划不是公共 API,但这允许在需要了解计划的罕见情况下使用。计划是一个 2 元组列表,第一个元素是迁移类的实例,第二个元素表示迁移是否回滚了(True)或应用了(False)。

应用 (apps)

一个Apps 实例,包含迁移运行之后项目的运行状态。它应该代替全局 apps 注册表来检索要对其执行操作的模型。

例如,你可以在 AppConfig 中注册一个回调,如下所示

from django.apps import AppConfig
from django.db.models.signals import post_migrate


def my_callback(sender, **kwargs):
    # Your specific logic here
    pass


class MyAppConfig(AppConfig):
    ...

    def ready(self):
        post_migrate.connect(my_callback, sender=self)

注意

如果将 AppConfig 实例作为发送者参数提供,请确保在 ready() 中注册了信号。AppConfig 会为使用修改后的 INSTALLED_APPS 集运行的测试(例如,当覆盖设置时)重新创建,并且应为每个新的 AppConfig 实例连接此类信号。

请求/响应信号

核心框架在处理请求时发送的信号。

警告

信号可能会使你的代码难以维护。在使用请求/响应信号之前,请考虑使用中间件

request_started

django.core.signals.request_started

当 Django 开始处理 HTTP 请求时发送。

随此信号发送的参数

sender

处理请求的处理程序类 – 例如 django.core.handlers.wsgi.WsgiHandler

环境变量 (environ)

提供给请求的 environ 字典。

request_finished

django.core.signals.request_finished

当 Django 完成向客户端传送 HTTP 响应时发送。

随此信号发送的参数

sender

与上面相同的处理程序类。

got_request_exception

django.core.signals.got_request_exception

每当 Django 在处理传入的 HTTP 请求时遇到异常时,都会发送此信号。

随此信号发送的参数

sender

未使用(始终为 None)。

请求 (request)

一个 HttpRequest 对象。

测试信号

只有在运行测试时才会发送的信号。

setting_changed

django.test.signals.setting_changed

当通过 django.test.TestCase.settings() 上下文管理器或 django.test.override_settings() 装饰器/上下文管理器更改设置的值时,会发送此信号。

它实际上发送了两次:应用新值时(“设置”)和恢复原始值时(“拆卸”)。使用 enter 参数来区分两者。

你还可以从 django.core.signals 导入此信号,以避免在非测试情况下从 django.test 导入。

随此信号发送的参数

sender

设置处理程序。

设置 (setting)

设置的名称。

值 (value)

更改后设置的值。对于最初不存在的设置,在“拆卸”阶段,valueNone

进入 (enter)

布尔值;如果应用了设置,则为 True;如果恢复了设置,则为 False

template_rendered

django.test.signals.template_rendered

当测试系统渲染模板时发送。此信号在 Django 服务器的正常运行期间不会发出 – 它仅在测试期间可用。

随此信号发送的参数

sender

已渲染的 Template 对象。

模板 (template)

与发送者相同。

上下文 (context)

用于渲染模板的 Context

数据库包装器

数据库包装器在启动数据库连接时发送的信号。

connection_created

django.db.backends.signals.connection_created

当数据库包装器与数据库建立初始连接时发送。如果你想向 SQL 后端发送任何连接后命令,这将特别有用。

随此信号发送的参数

sender

数据库包装器类 – 即 django.db.backends.postgresql.DatabaseWrapperdjango.db.backends.mysql.DatabaseWrapper 等。

连接 (connection)

已打开的数据库连接。这可以在多数据库配置中用于区分来自不同数据库的连接信号。

返回顶部