{"title":"信号","version":"3.2","locale":"zh-hans","docname":"ref/signals","url":"/zh-hans/3.2/ref/signals/","canonical":"https://djangodocs.dev/zh-hans/3.2/ref/signals/","summary":"Django 发送的所有信号的列表。所有内置的信号都是使用 send() 方法发送的。 See also 关于如何注册和接收信号的信息，请参见 信号收发 的文档。 认证框架 在 用户登录／退出时发送信号 。 模型信号 Link to this heading # django.db.models.signals…","html":"<h1>信号<a class=\"heading-anchor\" href=\"#signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 发送的所有信号的列表。所有内置的信号都是使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/signals/#django.dispatch.Signal.send\" title=\"django.dispatch.Signal.send\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send()</span></code></a> 方法发送的。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>关于如何注册和接收信号的信息，请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/signals/\"><span class=\"doc\">信号收发</span></a> 的文档。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/3.2/topics/auth/\"><span class=\"doc\">认证框架</span></a> 在 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/contrib/auth/#topics-auth-signals\"><span class=\"std std-ref\">用户登录／退出时发送信号</span></a>。</p>\n</aside>\n<section id=\"module-django.db.models.signals\">\n<span id=\"model-signals\"></span><h2>模型信号<a class=\"heading-anchor\" href=\"#module-django.db.models.signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"#module-django.db.models.signals\" title=\"django.db.models.signals: Signals sent by the model system.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.models.signals</span></code></a> 模块定义了一组由模型系统发送的信号。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>这些信号中有很多是由各种模型方法发送的，比如 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 或 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>，你可以在自己的代码中覆盖这些方法。</p>\n<p>如果你在模型上重写了这些方法，你必须调用父类的方法才能发送这些信号。</p>\n<p>还需要注意的是，Django 默认将信号处理程序存储为弱引用，所以如果你的处理程序是一个本地函数，它可能会被垃圾回收。 为了防止这种情况，当你调用信号的 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/signals/#django.dispatch.Signal.connect\" title=\"django.dispatch.Signal.connect\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">connect()</span></code></a> 时，传入 <code class=\"docutils literal notranslate\"><span class=\"pre\">weak=False</span></code>。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>模型信号 <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code> 模型可以在连接接收器时，通过指定其完整的应用程序标签进行惰性引用。例如，在 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 应用程序中定义的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> 模型可以被引用为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.Question'</span></code>。在处理循环导入依赖关系和可交换模型时，这种引用可以非常方便。</p>\n</aside>\n<section id=\"pre-init\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">pre_init</span></code><a class=\"heading-anchor\" href=\"#pre-init\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_init\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">pre_init</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_init\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>每当你实例化一个 Django 模型时，这个信号都会在模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 方法的开头发出。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>刚刚创建了一个实例的模型类。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">args</span></code></dt><dd><p>传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 的位置参数列表。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code></dt><dd><p>传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 的关键字参数字典。</p>\n</dd>\n</dl>\n<p>例如，<a class=\"reference internal\" href=\"/zh-hans/3.2/intro/tutorial02/\"><span class=\"doc\">教程</span></a> 有这样一行：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"p\">(</span><span class=\"n\">question_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> <span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>发送给 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_init\" title=\"django.db.models.signals.pre_init\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_init</span></code></a> 处理程序的参数是：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>参数</p></th>\n<th class=\"head\"><p>值</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> （类本身）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">args</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">[]</span></code> （一个空列表，因为没有向 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 传递位置参数）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{'question_text':</span> <span class=\"pre\">&quot;What's</span> <span class=\"pre\">new?&quot;,</span></code>\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'pub_date':</span> <span class=\"pre\">datetime.datetime(2012,</span> <span class=\"pre\">2,</span> <span class=\"pre\">26,</span> <span class=\"pre\">13,</span> <span class=\"pre\">0,</span> <span class=\"pre\">0,</span> <span class=\"pre\">775217,</span> <span class=\"pre\">tzinfo=&lt;UTC&gt;)}</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"post-init\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">post_init</span></code><a class=\"heading-anchor\" href=\"#post-init\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_init\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">post_init</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_init\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>和 pre_init 一样，但这个是在 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 方法完成后发送的。</p>\n<p>用此信号发送的参数：</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>如上：刚刚创建了一个实例的模型类。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>刚刚创建的模型的实际实例。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">instance._state</span></code></a> 在发送 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_init</span></code> 信号之前没有设置，所以 <code class=\"docutils literal notranslate\"><span class=\"pre\">_state</span></code> 属性总是有其默认值。例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">_state.db</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n</aside>\n</dd>\n</dl>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>出于性能考虑，你不应该在 <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_init</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_init</span></code> 信号的接收者中执行查询，因为在查询集迭代期间，它们会对每个返回的实例执行。</p>\n</aside>\n</section>\n<section id=\"pre-save\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">pre_save</span></code><a class=\"heading-anchor\" href=\"#pre-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_save\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">pre_save</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_save\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这是在模型的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> 方法开始时发送的。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>模型类</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>实际被保存的实例。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">raw</span></code></dt><dd><p>一个布尔值；<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 如果模型完全按照显示的方式保存（即加载固定数据时）。不应该查询／修改数据库中的其他记录，因为数据库可能还没有达到一致的状态。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>正在使用的数据库别名。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code></dt><dd><p>传递给 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code></a> 的要更新的字段集，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 没有传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>，则为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-save\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">post_save</span></code><a class=\"heading-anchor\" href=\"#post-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_save\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">post_save</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_save\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>就像 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> 一样，但在 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> 方法的最后发送。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>模型类</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>实际被保存的实例。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">created</span></code></dt><dd><p>一个布尔值；<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 如果创建了一个新记录。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">raw</span></code></dt><dd><p>一个布尔值；<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 如果模型完全按照显示的方式保存（即加载固定数据时）。不应该查询／修改数据库中的其他记录，因为数据库可能还没有达到一致的状态。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>正在使用的数据库别名。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code></dt><dd><p>传递给 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code></a> 的要更新的字段集，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 没有传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>，则为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n</dd>\n</dl>\n</section>\n<section id=\"pre-delete\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code><a class=\"heading-anchor\" href=\"#pre-delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">pre_delete</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在模型的 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 方法和查询集的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a> 方法开始时发送。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>模型类</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>实际被删除的实例。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>正在使用的数据库别名。</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-delete\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">post_delete</span></code><a class=\"heading-anchor\" href=\"#post-delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">post_delete</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>就像 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a> 一样，但在模型的 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 方法和查询集的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a> 方法结束时发送。</p>\n<p>用此信号发送的参数：</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>模型类</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>实际被删除的实例。</p>\n<p>请注意，该对象将不再在数据库中，所以要非常小心地处理这个实例。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>正在使用的数据库别名。</p>\n</dd>\n</dl>\n</section>\n<section id=\"m2m-changed\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">m2m_changed</span></code><a class=\"heading-anchor\" href=\"#m2m-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.m2m_changed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">m2m_changed</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.m2m_changed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当一个模型实例上的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 被改变时发出。严格来说，这不是一个模型信号，因为它是由 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 发送的，但由于它是对 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a>/<a class=\"reference internal\" href=\"#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a>/<a class=\"reference internal\" href=\"#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_delete</span></code></a> 的补充，当涉及到跟踪模型的变化时，它被包含在这里。</p>\n<p>用此信号发送的参数：</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>中间模型类描述 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a>。当定义了多对多字段时，这个类会自动创建；你可以使用多对多字段上的 <code class=\"docutils literal notranslate\"><span class=\"pre\">through</span></code> 属性来访问它。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></dt><dd><p>多对多关系被更新的实例。这可以是 <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code> 的实例，或者是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 所关联的类的实例。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">action</span></code></dt><dd><p>表示对关系进行更新的类型的字符串。可以是以下类型之一：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pre_add&quot;</span></code></dt><dd><p>在一个或多个对象被添加到关系 <em>之前</em> 发送。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;post_add&quot;</span></code></dt><dd><p>在一个或多个对象被添加到关系 <em>之后</em> 发送。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pre_remove&quot;</span></code></dt><dd><p>在一个或多个对象从关系中删除 <em>之前</em> 发送。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;post_remove&quot;</span></code></dt><dd><p>在一个或多个对象从关系中删除 <em>之后</em> 发送。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pre_clear&quot;</span></code></dt><dd><p>在关系被清除 <em>之前</em> 发送。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;post_clear&quot;</span></code></dt><dd><p>在关系被清除 <em>之后</em> 发送。</p>\n</dd>\n</dl>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code></dt><dd><p>表示关系的哪一面被更新（即被修改的是正向关系还是反向关系）。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code></dt><dd><p>从关系中添加、删除或清除的对象的类别。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">pk_set</span></code></dt><dd><p>对于 <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_add</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_add</span></code> 动作，这是一组将被或已经被添加到关系中的主键值。这可能是提交添加的值的一个子集，因为插入必须过滤现有的值，以避免数据库 <code class=\"docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code>。</p>\n<p>对于 <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_remove</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_remove</span></code> 动作来说，这是一组被提交从关系中删除的主键值。这并不取决于这些值是否会被实际删除或已经被删除。特别是，不存在的值可能会被提交，并且会出现在 <code class=\"docutils literal notranslate\"><span class=\"pre\">pk_set</span></code> 中，即使它们对数据库没有影响。</p>\n<p>对于 <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_clear</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_clear</span></code> 动作，是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>正在使用的数据库别名。</p>\n</dd>\n</dl>\n<p>例如，如果一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 可以有多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> 对象，模型如下：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Topping</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Pizza</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">toppings</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Topping</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果我们连接一个这样的处理程序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">m2m_changed</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">toppings_changed</span><span class=\"p\">(</span><span class=\"n\">sender</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Do something</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"n\">m2m_changed</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">toppings_changed</span><span class=\"p\">,</span> <span class=\"n\">sender</span><span class=\"o\">=</span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">through</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>然后做了这样的事情：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">Topping</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>发送给 <a class=\"reference internal\" href=\"#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">m2m_changed</span></code></a> 处理程序的参数（在上面的例子中，<code class=\"docutils literal notranslate\"><span class=\"pre\">toppings_changed</span></code>）将是：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>参数</p></th>\n<th class=\"head\"><p>值</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.toppings.through</span></code> （中间的 m2m 类）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> （被修改的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 实例）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">action</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pre_add&quot;</span></code> （后面是一个单独的信号 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;post_add&quot;</span></code>）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 包含 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a>，所以这个调用修改了前向关系）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> （添加到 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 中的对象类别）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pk_set</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{t.id}</span></code> （因为只有 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span> <span class=\"pre\">t</span></code> 被添加到关系中）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code> （因为默认的路由器在这里发送写入）</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>如果我们再做这样的事情：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">pizza_set</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>发送给 <a class=\"reference internal\" href=\"#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">m2m_changed</span></code></a> 处理程序的参数将是：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>参数</p></th>\n<th class=\"head\"><p>值</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.toppings.through</span></code> （中间的 m2m 类）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">t</span></code> （正在修改的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> 实例）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">action</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pre_remove&quot;</span></code> （后面是一个单独的信号 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;post_remove&quot;</span></code>）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 包含 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a>，所以这个调用修改了反向关系）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> （从 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> 中删除的对象类别）</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pk_set</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{p.id}</span></code> （因为只有 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span> <span class=\"pre\">p</span></code> 被从关系中删除）</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code> （因为默认的路由器在这里发送写入）</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"class-prepared\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">class_prepared</span></code><a class=\"heading-anchor\" href=\"#class-prepared\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.class_prepared\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">class_prepared</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.class_prepared\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当一个模型类被 “准备好” —— 即模型被定义并在 Django 的模型系统中注册时，就会发出这个信号。Django 在内部使用这个信号，第三方应用中一般不使用。</p>\n<p>由于这个信号是在应用注册表填充过程中发出的，而 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AppConfig.ready()</span></code></a> 是在应用注册表完全填充后运行的，所以不能在该方法中连接接收器。一种可能是用 <code class=\"docutils literal notranslate\"><span class=\"pre\">AppConfig.__init__()</span></code> 来代替连接它们，注意不要导入模型或触发对应用注册表的调用。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>刚刚准备好的模型类。</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"management-signals\">\n<h2>管理信号<a class=\"heading-anchor\" href=\"#management-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/\"><span class=\"doc\">django-admin</span></a> 发出的信号。</p>\n<section id=\"pre-migrate\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">pre_migrate</span></code><a class=\"heading-anchor\" href=\"#pre-migrate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_migrate\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">pre_migrate</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_migrate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>由 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 命令在开始安装应用程序之前发出。对于缺乏 <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> 模块的应用程序，它不会发出。</p>\n<p>用此信号发送的参数：</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>一个 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> 实例，用于即将迁移／同步的应用程序。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">app_config</span></code></dt><dd><p>同 <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code>。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code></dt><dd><p>表示 manage.py 在屏幕上打印了多少信息。详见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#cmdoption-verbosity\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--verbosity</span></code></a> 标志。</p>\n<p>监听 <a class=\"reference internal\" href=\"#django.db.models.signals.pre_migrate\" title=\"django.db.models.signals.pre_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_migrate</span></code></a> 的函数应该根据这个参数的值来调整它们向屏幕输出的内容。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code></dt><dd><p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，则可以安全地提示用户在命令行上输入东西。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>，则监听该信号的函数不应试图提示任何东西。</p>\n<p>例如 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> 应用只有在 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时才会提示创建超级用户。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>命令将运行的数据库的别名。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">plan</span></code></dt><dd><p>将用于迁移运行的迁移计划。虽然计划不是公开的 API，但这允许在极少数情况下有必要知道计划。计划是一个由二元元组组成的列表，第一项是迁移类的实例，第二项显示迁移是否被回滚（<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>）或应用（<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>）。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">apps</span></code></dt><dd><p><a class=\"reference internal\" href=\"/zh-hans/3.2/ref/applications/#module-django.apps\" title=\"django.apps\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">Apps</span></code></a> 的实例，包含迁移运行前的项目状态。它应该代替全局 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">apps</span></code> 注册表来检索你要执行操作的模型。</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-migrate\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code><a class=\"heading-anchor\" href=\"#post-migrate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_migrate\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.models.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">post_migrate</span></span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_migrate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> （即使没有运行迁移）和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> 命令结束时发出。对于缺乏 <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> 模块的应用程序，它不会被发出。</p>\n<p>该信号的处理者不能进行数据库模式的改变，因为如果在 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 命令期间运行 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> 命令，可能会导致 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> 命令失败。</p>\n<p>用此信号发送的参数：</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>一个 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code> 实例，用于刚刚安装的应用程序。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">app_config</span></code></dt><dd><p>同 <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code>。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code></dt><dd><p>表示 manage.py 在屏幕上打印了多少信息。详见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/#cmdoption-verbosity\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--verbosity</span></code></a> 标志。</p>\n<p>监听 <a class=\"reference internal\" href=\"#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> 的函数应该根据这个参数的值来调整它们向屏幕输出的内容。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code></dt><dd><p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，则可以安全地提示用户在命令行上输入东西。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>，则监听该信号的函数不应试图提示任何东西。</p>\n<p>例如 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> 应用只有在 <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时才会提示创建超级用户。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>用于同步的数据库别名。默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 数据库。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">plan</span></code></dt><dd><p>迁移运行时使用的迁移计划。虽然计划不是公开的 API，但这允许在极少数情况下有必要知道计划。计划是一个由二元元组组成的列表，第一项是迁移类的实例，第二项显示迁移是否被回滚（<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>）或应用（<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>）。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">apps</span></code></dt><dd><p><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">Apps</span></code> 的一个实例，包含迁移运行后项目的状态。它应该代替全局的 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">apps</span></code> 注册表来检索你要执行操作的模型。</p>\n</dd>\n</dl>\n<p>例如，你可以在一个 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code> 中注册一个回调，像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">post_migrate</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_callback</span><span class=\"p\">(</span><span class=\"n\">sender</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Your specific logic here</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyAppConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">post_migrate</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">my_callback</span><span class=\"p\">,</span> <span class=\"n\">sender</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>如果你提供了一个 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> 实例作为发送者参数，请确保该信号在 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ready()</span></code></a> 中注册。<code class=\"docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code> 会被重新创建，用于使用修改过的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 集合运行的测试（例如当配置被覆盖时），并且这种信号应该为每个新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code> 实例连接。</p>\n</aside>\n</section>\n</section>\n<section id=\"module-django.core.signals\">\n<span id=\"request-response-signals\"></span><h2>请求／响应信号<a class=\"heading-anchor\" href=\"#module-django.core.signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>核心框架处理请求时发出的信号。</p>\n<section id=\"request-started\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">request_started</span></code><a class=\"heading-anchor\" href=\"#request-started\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.request_started\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">request_started</span></span><a class=\"heading-anchor\" href=\"#django.core.signals.request_started\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当 Django 开始处理一个 HTTP 请求时发送。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>处理程序类 —— 例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.handlers.wsgi.wsgiHandler</span></code> —— 处理该请求。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">environ</span></code></dt><dd><p>向请求提供的 <code class=\"docutils literal notranslate\"><span class=\"pre\">environ</span></code> 字典。</p>\n</dd>\n</dl>\n</section>\n<section id=\"request-finished\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">request_finished</span></code><a class=\"heading-anchor\" href=\"#request-finished\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.request_finished\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">request_finished</span></span><a class=\"heading-anchor\" href=\"#django.core.signals.request_finished\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当 Django 完成向客户端发送 HTTP 响应时发送。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>处理程序类，同上。</p>\n</dd>\n</dl>\n</section>\n<section id=\"got-request-exception\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">got_request_exception</span></code><a class=\"heading-anchor\" href=\"#got-request-exception\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.got_request_exception\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">got_request_exception</span></span><a class=\"heading-anchor\" href=\"#django.core.signals.got_request_exception\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当 Django 在处理一个传入的 HTTP 请求时遇到异常时，就会发出这个信号。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>未使用（总是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>）。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code></dt><dd><p><a class=\"reference internal\" href=\"/zh-hans/3.2/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> 对象。</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"module-django.test.signals\">\n<span id=\"test-signals\"></span><h2>测试信号<a class=\"heading-anchor\" href=\"#module-django.test.signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>只有当 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/testing/overview/#running-tests\"><span class=\"std std-ref\">运行测试</span></a> 时才会发出信号。</p>\n<section id=\"setting-changed\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">setting_changed</span></code><a class=\"heading-anchor\" href=\"#setting-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.test.signals.setting_changed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.test.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">setting_changed</span></span><a class=\"heading-anchor\" href=\"#django.test.signals.setting_changed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.TestCase.settings()</span></code> 上下文管理器或 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/testing/tools/#django.test.override_settings\" title=\"django.test.override_settings\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.test.override_settings()</span></code></a> 装饰器／上下文管理器改变配置值时，会发出这个信号。</p>\n<p>它实际上被发送了两次：当应用新的值时（&quot;setup&quot;）和当恢复原始值时（&quot;drawdown&quot;）。使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">enter</span></code> 参数来区分这两种情况。</p>\n<p>你也可以从 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.signals</span></code> 导入这个信号，以避免在非测试情况下从 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test</span></code> 导入。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>配置处理程序。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">setting</span></code></dt><dd><p>配置的名称。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code></dt><dd><p>更改后的配置值。对于最初不存在的配置，在 &quot;teardown&quot; 阶段，<code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">enter</span></code></dt><dd><p>一个布尔值；<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 如果配置被应用，<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 如果恢复。</p>\n</dd>\n</dl>\n</section>\n<section id=\"template-rendered\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">template_rendered</span></code><a class=\"heading-anchor\" href=\"#template-rendered\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.test.signals.template_rendered\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.test.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_rendered</span></span><a class=\"heading-anchor\" href=\"#django.test.signals.template_rendered\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当测试系统渲染一个模板时发出。这个信号在 Django 服务器正常运行时不会发出，只有在测试时才会发出。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>被渲染的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Template</span></code></a> 对象。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">template</span></code></dt><dd><p>与发送器相同</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code></dt><dd><p>渲染模板的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/templates/api/#django.template.Context\" title=\"django.template.Context\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Context</span></code></a>。</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"module-django.db.backends\">\n<span id=\"database-wrappers\"></span><h2>数据库包装器<a class=\"heading-anchor\" href=\"#module-django.db.backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当数据库连接启动时，数据库包装器发出的信号。</p>\n<section id=\"connection-created\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">connection_created</span></code><a class=\"heading-anchor\" href=\"#connection-created\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.signals.connection_created\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.db.backends.signals.</span></span><span class=\"sig-name descname\"><span class=\"pre\">connection_created</span></span><a class=\"heading-anchor\" href=\"#django.db.backends.signals.connection_created\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当数据库包装器与数据库进行初始连接时发送。 如果你想向 SQL 后端发送任何连接后的命令，这一点特别有用。</p>\n<p>用此信号发送的参数：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code></dt><dd><p>数据库封装类 —— 即 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.postgresql.DatabaseWrapper</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.mysql.DatabaseWrapper</span></code> 等。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code></dt><dd><p>打开的数据库连接。这在多数据库配置中可以用来区分不同数据库的连接信号。</p>\n</dd>\n</dl>\n</section>\n</section>","rootId":"signals","toc":[{"title":"模型信号","anchor":"module-django.db.models.signals","children":[{"title":"pre_init","anchor":"pre-init","children":[]},{"title":"post_init","anchor":"post-init","children":[]},{"title":"pre_save","anchor":"pre-save","children":[]},{"title":"post_save","anchor":"post-save","children":[]},{"title":"pre_delete","anchor":"pre-delete","children":[]},{"title":"post_delete","anchor":"post-delete","children":[]},{"title":"m2m_changed","anchor":"m2m-changed","children":[]},{"title":"class_prepared","anchor":"class-prepared","children":[]}]},{"title":"管理信号","anchor":"management-signals","children":[{"title":"pre_migrate","anchor":"pre-migrate","children":[]},{"title":"post_migrate","anchor":"post-migrate","children":[]}]},{"title":"请求／响应信号","anchor":"module-django.core.signals","children":[{"title":"request_started","anchor":"request-started","children":[]},{"title":"request_finished","anchor":"request-finished","children":[]},{"title":"got_request_exception","anchor":"got-request-exception","children":[]}]},{"title":"测试信号","anchor":"module-django.test.signals","children":[{"title":"setting_changed","anchor":"setting-changed","children":[]},{"title":"template_rendered","anchor":"template-rendered","children":[]}]},{"title":"数据库包装器","anchor":"module-django.db.backends","children":[{"title":"connection_created","anchor":"connection-created","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/3.2/ref/"}],"prev":{"docname":"ref/settings","title":"配置","url":"/zh-hans/3.2/ref/settings/"},"next":{"docname":"ref/templates/index","title":"模板","url":"/zh-hans/3.2/ref/templates/"},"formats":{"html":"/zh-hans/3.2/ref/signals/","markdown":"/zh-hans/3.2/ref/signals.md","json":"/zh-hans/3.2/ref/signals.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/ref/signals.txt","official":"https://docs.djangoproject.com/zh-hans/3.2/ref/signals/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}