{"title":"关系对象参考","version":"3.0","locale":"zh-hans","docname":"ref/models/relations","url":"/zh-hans/3.0/ref/models/relations/","canonical":"https://djangodocs.dev/zh-hans/3.0/ref/models/relations/","summary":"“关系管理器”是一个用于处理“一对多”和“多对多”关联关系的管理器。在以下两种情况用到：“另一边”的关联关系 ForeignKey。即、在上面的例子中，以下方法会在管理器…","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\">class</span> </em><span class=\"sig-name descname\">RelatedManager</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/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Reporter</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    reporter <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Reporter<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></div>\n<p>在上面的例子中，以下方法会在管理器 <code class=\"docutils literal notranslate\">reporter.article_set</code> 中可用。</p>\n</li>\n<li><p>双边关系 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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=\"nc\">Topping</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Pizza</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    toppings <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Topping<span class=\"p\">)</span>\n</code></pre></div>\n<p>在这个例子中，下文列出的方法在 <code class=\"docutils literal notranslate\">topping.pizza_set</code> 和 <code class=\"docutils literal notranslate\">pizza.toppings</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\">add</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>objs</em>, <em class=\"sig-param\">bulk<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">through_defaults<span class=\"o\">=</span><span class=\"default_value\">None</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>add<span class=\"p\">(</span>e<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/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 关联关系，才可以使用 <a class=\"reference internal\" href=\"/zh-hans/3.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\">QuerySet.update()</code></a> 更新数据。这要求对象事先已经被保存在数据库内了。</p>\n<p>你可以使用 <code class=\"docutils literal notranslate\">bulk=False</code> 参数让关系管理器通过调用 <code class=\"docutils literal notranslate\">e.save()</code> 来执行更新操作。</p>\n<p>Using <code class=\"docutils literal notranslate\">add()</code> with a many-to-many relationship, however, will not\ncall any <code class=\"docutils literal notranslate\">save()</code> methods (the <code class=\"docutils literal notranslate\">bulk</code> argument doesn't exist), but\nrather create the relationships using <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.bulk_create()</code></a>. If you need to execute\nsome custom logic when a relationship is created, listen to the\n<a class=\"reference internal\" href=\"/zh-hans/3.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\">m2m_changed</code></a> signal, which will\ntrigger <code class=\"docutils literal notranslate\">pre_add</code> and <code class=\"docutils literal notranslate\">post_add</code> actions.</p>\n<p>Using <code class=\"docutils literal notranslate\">add()</code> on a relation that already exists won't duplicate the\nrelation, but it will still trigger signals.</p>\n<p>For many-to-many relationships <code class=\"docutils literal notranslate\">add()</code> accepts either model instances\nor field values, normally primary keys, as the <code class=\"docutils literal notranslate\">*objs</code> argument.</p>\n<p>Use the <code class=\"docutils literal notranslate\">through_defaults</code> argument to specify values for the new\n<a class=\"reference internal\" href=\"/zh-hans/3.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">intermediate model</span></a> instance(s), if\nneeded.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 2.2</p><p>The <code class=\"docutils literal notranslate\">through_defaults</code> argument was added.</p>\n</aside>\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\">create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">through_defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>e <span class=\"o\">=</span> b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    body_text<span class=\"o\">=</span><span class=\"s1\">&#39;Hi&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<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>This is equivalent to (but simpler than):</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>e <span class=\"o\">=</span> Entry<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    blog<span class=\"o\">=</span>b<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    body_text<span class=\"o\">=</span><span class=\"s1\">&#39;Hi&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<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>e<span class=\"o\">.</span>save<span class=\"p\">(</span>force_insert<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>无需指定定义了模型间关系的关键字参数。在上述例子中，我们并未向 <code class=\"docutils literal notranslate\">create()</code> 传递参数 <code class=\"docutils literal notranslate\">blog</code>。Django 知道要将新 <code class=\"docutils literal notranslate\">Entry</code> 对象的 <code class=\"docutils literal notranslate\">blog</code> 字段设置为 <code class=\"docutils literal notranslate\">b</code>。</p>\n<p>Use the <code class=\"docutils literal notranslate\">through_defaults</code> argument to specify values for the new\n<a class=\"reference internal\" href=\"/zh-hans/3.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">intermediate model</span></a> instance, if\nneeded.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 2.2</p><p>The <code class=\"docutils literal notranslate\">through_defaults</code> argument was added.</p>\n</aside>\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\">remove</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>objs</em>, <em class=\"sig-param\">bulk<span class=\"o\">=</span><span class=\"default_value\">True</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>remove<span class=\"p\">(</span>e<span class=\"p\">)</span> <span class=\"c1\"># Disassociates Entry e from Blog b.</span>\n</code></pre></div>\n<p>Similar to <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\">add()</code></a>, <code class=\"docutils literal notranslate\">e.save()</code> is called in the example above\nto perform the update. Using <code class=\"docutils literal notranslate\">remove()</code> with a many-to-many\nrelationship, however, will delete the relationships using\n<a class=\"reference internal\" href=\"/zh-hans/3.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\">QuerySet.delete()</code></a> which\nmeans no model <code class=\"docutils literal notranslate\">save()</code> methods are called; listen to the\n<a class=\"reference internal\" href=\"/zh-hans/3.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\">m2m_changed</code></a> signal if you wish to\nexecute custom code when a relationship is deleted.</p>\n<p>For many-to-many relationships <code class=\"docutils literal notranslate\">remove()</code> accepts either model\ninstances or field values, normally primary keys, as the <code class=\"docutils literal notranslate\">*objs</code>\nargument.</p>\n<p>For <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> objects, this method only\nexists if <code class=\"docutils literal notranslate\">null=True</code>. If the related field can't be set to <code class=\"docutils literal notranslate\">None</code>\n(<code class=\"docutils literal notranslate\">NULL</code>), then an object can't be removed from a relation without\nbeing added to another. In the above example, removing <code class=\"docutils literal notranslate\">e</code> from\n<code class=\"docutils literal notranslate\">b.entry_set()</code> is equivalent to doing <code class=\"docutils literal notranslate\">e.blog = None</code>, and because\nthe <code class=\"docutils literal notranslate\">blog</code> <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> doesn't have\n<code class=\"docutils literal notranslate\">null=True</code>, this is invalid.</p>\n<p>For <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> objects, this method accepts\na <code class=\"docutils literal notranslate\">bulk</code> argument to control how to perform the operation.\nIf <code class=\"docutils literal notranslate\">True</code> (the default), <code class=\"docutils literal notranslate\">QuerySet.update()</code> is used.\nIf <code class=\"docutils literal notranslate\">bulk=False</code>, the <code class=\"docutils literal notranslate\">save()</code> method of each individual model\ninstance is called instead. This triggers the\n<a class=\"reference internal\" href=\"/zh-hans/3.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\">pre_save</code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/3.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\">post_save</code></a> signals and comes at the\nexpense of performance.</p>\n<p>For many-to-many relationships, the <code class=\"docutils literal notranslate\">bulk</code> keyword argument doesn't\nexist.</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\">clear</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">bulk<span class=\"o\">=</span><span class=\"default_value\">True</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>clear<span class=\"p\">()</span>\n</code></pre></div>\n<p>Note this doesn't delete the related objects -- it just disassociates\nthem.</p>\n<p>Just like <code class=\"docutils literal notranslate\">remove()</code>, <code class=\"docutils literal notranslate\">clear()</code> is only available on\n<a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>s where <code class=\"docutils literal notranslate\">null=True</code> and it also\naccepts the <code class=\"docutils literal notranslate\">bulk</code> keyword argument.</p>\n<p>For many-to-many relationships, the <code class=\"docutils literal notranslate\">bulk</code> keyword argument doesn't\nexist.</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\">set</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">bulk<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">clear<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">through_defaults<span class=\"o\">=</span><span class=\"default_value\">None</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>Replace the set of related objects:</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>new_list <span class=\"o\">=</span> <span class=\"p\">[</span>obj1<span class=\"p\">,</span> obj2<span class=\"p\">,</span> obj3<span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>related_set<span class=\"o\">.</span>set<span class=\"p\">(</span>new_list<span class=\"p\">)</span>\n</code></pre></div>\n<p>This method accepts a <code class=\"docutils literal notranslate\">clear</code> argument to control how to perform the\noperation. If <code class=\"docutils literal notranslate\">False</code> (the default), the elements missing from the\nnew set are removed using <code class=\"docutils literal notranslate\">remove()</code> and only the new ones are added.\nIf <code class=\"docutils literal notranslate\">clear=True</code>, the <code class=\"docutils literal notranslate\">clear()</code> method is called instead and the\nwhole set is added at once.</p>\n<p>For <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> objects, the <code class=\"docutils literal notranslate\">bulk</code>\nargument is passed on to <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\">add()</code></a> and <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\">remove()</code></a>.</p>\n<p>For many-to-many relationships, the <code class=\"docutils literal notranslate\">bulk</code> keyword argument doesn't\nexist.</p>\n<p>Note that since <code class=\"docutils literal notranslate\">set()</code> is a compound operation, it is subject to\nrace conditions. For instance, new objects may be added to the database\nin between the call to <code class=\"docutils literal notranslate\">clear()</code> and the call to <code class=\"docutils literal notranslate\">add()</code>.</p>\n<p>For many-to-many relationships <code class=\"docutils literal notranslate\">set()</code> accepts a list of either model\ninstances or field values, normally primary keys, as the <code class=\"docutils literal notranslate\">objs</code>\nargument.</p>\n<p>Use the <code class=\"docutils literal notranslate\">through_defaults</code> argument to specify values for the new\n<a class=\"reference internal\" href=\"/zh-hans/3.0/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">intermediate model</span></a> instance(s), if\nneeded.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 2.2</p><p>The <code class=\"docutils literal notranslate\">through_defaults</code> argument was added.</p>\n</aside>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Note that <code class=\"docutils literal notranslate\">add()</code>, <code class=\"docutils literal notranslate\">create()</code>, <code class=\"docutils literal notranslate\">remove()</code>, <code class=\"docutils literal notranslate\">clear()</code>, and\n<code class=\"docutils literal notranslate\">set()</code> all apply database changes immediately for all types of\nrelated fields. In other words, there is no need to call <code class=\"docutils literal notranslate\">save()</code>\non either end of the relationship.</p>\n<p>If you use <a class=\"reference internal\" href=\"/zh-hans/3.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\">prefetch_related()</code></a>,\nthe <code class=\"docutils literal notranslate\">add()</code>, <code class=\"docutils literal notranslate\">remove()</code>, <code class=\"docutils literal notranslate\">clear()</code>, and <code class=\"docutils literal notranslate\">set()</code> methods clear\nthe prefetched cache.</p>\n</aside>\n</dd></dl>","rootId":"related-objects-reference","toc":[],"breadcrumbs":[{"docname":"ref/index","title":"API参考","url":"/zh-hans/3.0/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/3.0/ref/models/"}],"prev":{"docname":"ref/models/meta","title":"Model _meta API","url":"/zh-hans/3.0/ref/models/meta/"},"next":{"docname":"ref/models/class","title":"Model class reference","url":"/zh-hans/3.0/ref/models/class/"},"formats":{"html":"/zh-hans/3.0/ref/models/relations/","markdown":"/zh-hans/3.0/ref/models/relations.md","json":"/zh-hans/3.0/ref/models/relations.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/models/relations.txt","official":"https://docs.djangoproject.com/zh-hans/3.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","pt-br","ko","es","el","pl"]}