{"title":"关联对象参考","version":"4.0","locale":"zh-hans","docname":"ref/models/relations","url":"/zh-hans/4.0/ref/models/relations/","canonical":"https://djangodocs.dev/zh-hans/4.0/ref/models/relations/","summary":"class RelatedManager Link to this definition # “关系管理器”是一个用于处理一对多和多对多关系的管理器。在以下两种情况用到： ForeignKey 关系的“另一边”。即： Code Copy from django.db import models class Blog (…","html":"<h1>关联对象参考<a class=\"heading-anchor\" href=\"#related-objects-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RelatedManager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>“关系管理器”是一个用于处理一对多和多对多关系的管理器。在以下两种情况用到：</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Blog</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\">Entry</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=\"n\">blog</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span> <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>In the above example, the methods below will be available on\nthe manager <code class=\"docutils literal notranslate\"><span class=\"pre\">blog.entry_set</span></code>.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.0/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<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=\"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>在这个例子中，下文列出的方法在 <code class=\"docutils literal notranslate\"><span class=\"pre\">topping.pizza_set</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings</span></code> 中均可用。</p>\n</li>\n</ul>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager.add\">\n<span class=\"sig-name descname\"><span class=\"pre\">add</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">bulk</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">through_defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager.add\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将指定的模型对象加入关联对象集。</p>\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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">234</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">entry_set</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">)</span> <span class=\"c1\"># Associates Entry e with Blog b.</span>\n</code></pre></div>\n<p>上述例子中，由于有 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 关系，才可以使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code></a> 更新数据。这要求对象事先已经被保存在数据库内了。</p>\n<p>你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk=False</span></code> 参数让关系管理器通过调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">e.save()</span></code> 来执行更新操作。</p>\n<p>但是，在多对多关系中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>，不会调用任何 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法（<code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 参数不存在），而是使用 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.bulk_create()</span></code> 创建关系。如果需要在创建关系时执行一些自定义逻辑，可以监听 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/signals/#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\">pre_add</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_add</span></code> 动作。</p>\n<p>在已经存在的关系上使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> 不会重复关系，但仍然会触发信号。</p>\n<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> 接受模型实例或字段值，通常是主键，作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">*objs</span></code> 参数。</p>\n<p>如果需要的话，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 参数为新的 <a class=\"reference internal\" href=\"/zh-hans/4.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">中间模型</span></a> 实例指定值。你可以使用可调用对象作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 字典中的值，它们将在创建任何中间实例之前被执行一次。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager.create\">\n<span class=\"sig-name descname\"><span class=\"pre\">create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">through_defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager.create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">entry_set</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">body_text</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hi&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n\n<span class=\"go\"># No need to call e.save() at this point -- it&#39;s already been saved.</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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">body_text</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hi&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>无需指定定义了模型间关系的关键字参数。在上述例子中，我们并未向 <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code> 传递参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code>。Django 知道要将新 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> 对象的 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> 字段设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">b</span></code>。</p>\n<p>如果需要的话，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 参数为新的 <a class=\"reference internal\" href=\"/zh-hans/4.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">中间模型</span></a> 实例指定值。你可以使用可调用对象作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 字典中的值。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager.remove\">\n<span class=\"sig-name descname\"><span class=\"pre\">remove</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">bulk</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager.remove\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">234</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">entry_set</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">)</span> <span class=\"c1\"># Disassociates Entry e from Blog b.</span>\n</code></pre></div>\n<p>与 <a class=\"reference internal\" href=\"#django.db.models.fields.related.RelatedManager.add\" title=\"django.db.models.fields.related.RelatedManager.add\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add()</span></code></a> 类似，在上面的例子中调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">e.save()</span></code> 来执行更新。但是，对多对多关系使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code>，将使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/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\">QuerySet.delete()</span></code></a> 删除关系，这意味着没有调用模型 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法；如果想在删除关系时执行自定义代码，请监听 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/signals/#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<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> 接受模型实例或字段值，通常是主键，作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">*objs</span></code> 参数。</p>\n<p>对于 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 对象，只有当 <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> 时，这个方法才存在。如果相关字段不能设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>），那么一个对象就不能从一个关系中删除而不被添加到另一个关系中。在上面的例子中，从 <code class=\"docutils literal notranslate\"><span class=\"pre\">b.entry_set()</span></code> 中删除 <code class=\"docutils literal notranslate\"><span class=\"pre\">e</span></code> 相当于做了 <code class=\"docutils literal notranslate\"><span class=\"pre\">e.blog</span> <span class=\"pre\">=</span> <span class=\"pre\">None</span></code>，由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey`</span></code> 没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>，所以这是无效的。</p>\n<p>对于 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 对象，这个方法接受一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 参数来控制如何执行操作。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> （默认），则使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code>。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk=False</span></code>，则调用每个单独模型实例的 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法。这将触发 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/signals/#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/4.0/ref/signals/#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> 信号，并以牺牲性能为代价。</p>\n<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 关键字参数不存在。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager.clear\">\n<span class=\"sig-name descname\"><span class=\"pre\">clear</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">bulk</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager.clear\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">entry_set</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>请注意，这并不会删除相关的对象——只是将它们脱离关联。</p>\n<p>和 <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> 一样，<code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 只在 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 上可用，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>，而且它还接受 <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 关键字参数。</p>\n<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 关键字参数不存在。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.fields.related.RelatedManager.set\">\n<span class=\"sig-name descname\"><span class=\"pre\">set</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">bulk</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">clear</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">through_defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.fields.related.RelatedManager.set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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\">new_list</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">obj1</span><span class=\"p\">,</span> <span class=\"n\">obj2</span><span class=\"p\">,</span> <span class=\"n\">obj3</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">related_set</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"n\">new_list</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>本方法接受一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear</span></code> 参数来控制如何执行操作。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> （默认），则使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> 删除新集合中缺少的元素，只添加新元素。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear=True</span></code>，则调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 方法，一次性添加整个集合。</p>\n<p>对于 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 参数被传递给 <a class=\"reference internal\" href=\"#django.db.models.fields.related.RelatedManager.add\" title=\"django.db.models.fields.related.RelatedManager.add\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.fields.related.RelatedManager.remove\" title=\"django.db.models.fields.related.RelatedManager.remove\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove()</span></code></a>。</p>\n<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> 关键字参数不存在。</p>\n<p>请注意，由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> 是一个复合操作，它受到竞争条件的影响。例如，在调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 和调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> 之间可能会向数据库中添加新的对象。</p>\n<p>对于多对多关系，<code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> 接受一个模型实例或字段值的列表，通常是主键，作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> 参数。</p>\n<p>如果需要的话，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 参数为新的 <a class=\"reference internal\" href=\"/zh-hans/4.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">中间模型</span></a> 实例指定值。你可以使用可调用对象作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> 字典中的值，它们将在创建任何中间实例之前被执行一次。</p>\n</dd></dl>\n\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\">add()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> 都会对所有类型的相关字段立即应用数据库变化。换句话说，没有必要在关系的任何一端调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>。</p>\n<p>如果使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a>，<code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> 方法会清除预取缓存。</p>\n</aside>\n</dd></dl>","rootId":"related-objects-reference","toc":[],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.0/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/4.0/ref/models/"}],"prev":{"docname":"ref/models/meta","title":"模型 _meta API","url":"/zh-hans/4.0/ref/models/meta/"},"next":{"docname":"ref/models/class","title":"模型类参考","url":"/zh-hans/4.0/ref/models/class/"},"formats":{"html":"/zh-hans/4.0/ref/models/relations/","markdown":"/zh-hans/4.0/ref/models/relations.md","json":"/zh-hans/4.0/ref/models/relations.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/ref/models/relations.txt","official":"https://docs.djangoproject.com/zh-hans/4.0/ref/models/relations/","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"]}