{"title":"Référence des objets liés","version":"3.2","locale":"fr","docname":"ref/models/relations","url":"/fr/3.2/ref/models/relations/","canonical":"https://djangodocs.dev/fr/3.2/ref/models/relations/","summary":"class RelatedManager Lien vers cette définition # Un gestionnaire de liaison (« related manager ») est un gestionnaire utilisé dans un contexte de champ lié…","html":"<h1>Référence des objets liés<a class=\"heading-anchor\" href=\"#related-objects-reference\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un gestionnaire de liaison (« related manager ») est un gestionnaire utilisé dans un contexte de champ lié un-à-plusieurs ou plusieurs-à-plusieurs. Cela se produit dans deux cas :</p>\n<ul>\n<li><p>Le « côté opposé » d’une relation <a class=\"reference internal\" href=\"/fr/3.2/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>. C’est-à-dire :</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>Dans l’exemple ci-dessus, les méthodes ci-dessous seront disponibles pour le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">blog.entry_set</span></code>.</p>\n</li>\n<li><p>Les deux côtés d’une relation <a class=\"reference internal\" href=\"/fr/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<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>Dans cet exemple, les méthodes ci-dessous seront disponibles à la fois pour <code class=\"docutils literal notranslate\"><span class=\"pre\">topping.pizza_set</span></code> et pour <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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ajoute les objets modèles indiqués à l’ensemble des objets liés.</p>\n<p>Exemple :</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>Dans l’exemple ci-dessus, dans le cas d’une relation <a class=\"reference internal\" href=\"/fr/3.2/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=\"/fr/3.2/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> est utilisée pour effectuer la mise à jour. Ceci nécessite que les objets soient déjà enregistrés.</p>\n<p>Vous pouvez utiliser le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk=False</span></code> pour que la mise à jour soit effectuée plutôt par le gestionnaire de la relation en appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">e.save()</span></code>.</p>\n<p>Cependant, l’emploi de <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> avec une relation plusieurs-à-plusieurs n’appelle aucune méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> (le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> n’existe pas), mais crée plutôt les relations en utilisant <a class=\"reference internal\" href=\"/fr/3.2/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\"><span class=\"pre\">QuerySet.bulk_create()</span></code></a>. Si vous avez besoin de faire exécuter une certaine logique personnalisée lors de la création d’une relation, faites-le dans une fonction à l’écoute du signal <a class=\"reference internal\" href=\"/fr/3.2/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>, qui va déclencher les actions <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_add</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">post_add</span></code>.</p>\n<p>L’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> sur une relation qui existe déjà ne va pas dupliquer la relation, mais cela va tout de même déclencher les signaux.</p>\n<p>Pour les relations plusieurs-à-plusieurs, <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> accepte dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">*objs</span></code> soit des instances de modèles, soit des valeurs de champs, en principe des clés primaires.</p>\n<p>Utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> pour définir les valeurs des nouvelles instances du <a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">modèle intermédiaire</span></a>, si nécessaire. Vous pouvez utiliser des valeurs exécutables dans le dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code>, elles seront évaluées une fois avant la création d’instances intermédiaires.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Les valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> peuvent dorénavant être des objets exécutables.</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\"><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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée un nouvel objet, l’enregistre et le place dans l’ensemble des objets liés. Renvoie l’objet nouvellement créé :</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>C’est équivalent à (mais plus simple) :</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>Notez qu’il n’y a pas besoin de fournir le paramètre nommé du modèle qui définit la relation. Dans l’exemple ci-dessus, nous ne transmettons pas le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code>. Django réalise lui-même que le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> du nouvel objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> doit recevoir la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">b</span></code>.</p>\n<p>Utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> pour définir les valeurs des nouvelles instances du <a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">modèle intermédiaire</span></a>, si nécessaire. Vous pouvez utiliser des valeurs exécutables dans le dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Les valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> peuvent dorénavant être des objets exécutables.</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\"><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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Enlève les objets modèles indiqués de l’ensemble des objets liés :</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>Comme avec <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>, on appelle <code class=\"docutils literal notranslate\"><span class=\"pre\">e.save()</span></code> dans l’exemple ci-dessus pour effectuer la mise à jour. Cependant, l’emploi de <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> avec une relation plusieurs-à-plusieurs supprime les relations avec <a class=\"reference internal\" href=\"/fr/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\">QuerySet.delete()</span></code></a>, ce qui signifie qu’aucune méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> n’est appelée. Si vous avez besoin de faire exécuter du code personnalisé lors de la suppression d’une relation, faites-le dans une fonction à l’écoute du signal <a class=\"reference internal\" href=\"/fr/3.2/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>Pour les relations plusieurs-à-plusieurs, <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> accepte dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">*objs</span></code> soit des instances de modèles, soit des valeurs de champs, en principe des clés primaires.</p>\n<p>Pour les objets <a class=\"reference internal\" href=\"/fr/3.2/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>, cette méthode existe seulement quand <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>. Si le champ lié ne peut pas recevoir la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>), alors un objet ne peut pas être enlevé d’une relation sans être ajouté à une autre. Dans l’exemple ci-dessus, enlever <code class=\"docutils literal notranslate\"><span class=\"pre\">e</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">b.entry_set()</span></code> est l’équivalent de la définition <code class=\"docutils literal notranslate\"><span class=\"pre\">e.blog</span> <span class=\"pre\">=</span> <span class=\"pre\">None</span></code>, et comme la clé <a class=\"reference internal\" href=\"/fr/3.2/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\">blog</span></code> n’a pas l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>, ce n’est pas valide.</p>\n<p>Pour les objets <a class=\"reference internal\" href=\"/fr/3.2/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>, cette méthode accepte un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> pour contrôler comment effectuer l’opération. Avec <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (valeur par défaut), c’est <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code> qui est utilisé. Avec <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk=False</span></code>, c’est plutôt la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> de chaque instance de modèle individuelle qui est appelée. Cela déclenche les signaux <a class=\"reference internal\" href=\"/fr/3.2/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> et <a class=\"reference internal\" href=\"/fr/3.2/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> au détriment d’une perte de performance.</p>\n<p>Pour les relations plusieurs-à-plusieurs, le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> n’existe pas.</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Enlève tous les objets de l’ensemble des objets liés :</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>Notez que cela ne supprime pas les objets liés, il ne fait que les dissocier.</p>\n<p>Tout comme <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> n’est disponible pour un champ <a class=\"reference internal\" href=\"/fr/3.2/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> que lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> et il accepte également le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code>.</p>\n<p>Pour les relations plusieurs-à-plusieurs, le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> n’existe pas.</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Remplace l’ensemble des objets liés :</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>Cette méthode accepte un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">clear</span></code> pour contrôler le fonctionnement de l’opération. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> (par défaut), les éléments manquants dans le nouvel ensemble sont supprimés avec <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> et seuls les nouveaux sont ajoutés. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">clear=True</span></code>, la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> est appelée à la place et l’ensemble est ajouté en une seule fois.</p>\n<p>Pour les objets <a class=\"reference internal\" href=\"/fr/3.2/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>, le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> est transmis à <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> et à <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>Pour les relations plusieurs-à-plusieurs, le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">bulk</span></code> n’existe pas.</p>\n<p>Notez que dans la mesure où <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> est une opération composée, elle est sujette aux situations de concurrence. Par exemple, de nouveaux objets pourraient être ajoutés à la base de données entre l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> et l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>.</p>\n<p>Pour les relations plusieurs-à-plusieurs, <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> accepte dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> soit une liste d’instances de modèles, soit une liste de valeurs de champs, en principe des clés primaires.</p>\n<p>Utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> pour définir les valeurs des nouvelles instances du <a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/#intermediary-manytomany\"><span class=\"std std-ref\">modèle intermédiaire</span></a>, si nécessaire. Vous pouvez utiliser des valeurs exécutables dans le dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code>, elles seront évaluées une fois avant la création d’instances intermédiaires.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Les valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">through_defaults</span></code> peuvent dorénavant être des objets exécutables.</p>\n</aside>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Notez que <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> appliquent tous immédiatement les modifications de base de données pour tous les types de champs de relation. En d’autres termes, il n’est pas nécessaire d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> ni d’un côté de la relation, ni de l’autre.</p>\n<p>Si vous utilisez <a class=\"reference internal\" href=\"/fr/3.2/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>, les méthodes <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> effacent le cache de préchargement.</p>\n</aside>\n</dd></dl>","rootId":"related-objects-reference","toc":[],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.2/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/3.2/ref/models/"}],"prev":{"docname":"ref/models/meta","title":"L’API _meta des modèles","url":"/fr/3.2/ref/models/meta/"},"next":{"docname":"ref/models/class","title":"Référence de la classe Model","url":"/fr/3.2/ref/models/class/"},"formats":{"html":"/fr/3.2/ref/models/relations/","markdown":"/fr/3.2/ref/models/relations.md","json":"/fr/3.2/ref/models/relations.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/ref/models/relations.txt","official":"https://docs.djangoproject.com/fr/3.2/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","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}