{"title":"Gestionnaires","version":"4.1","locale":"fr","docname":"topics/db/managers","url":"/fr/4.1/topics/db/managers/","canonical":"https://djangodocs.dev/fr/4.1/topics/db/managers/","summary":"class Manager Lien vers cette définition # Un gestionnaire (objet Manager ) est l’interface par laquelle les opérations de requêtes de base de données sont mises à…","html":"<h1>Gestionnaires<a class=\"heading-anchor\" href=\"#managers\"><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.Manager\">\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\">Manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Manager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Un gestionnaire (objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>) est l’interface par laquelle les opérations de requêtes de base de données sont mises à disposition des modèles Django. Il existe au moins un <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> pour chaque modèle d’une application Django.</p>\n<p>Le fonctionnement des classes <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> est documenté dans <a class=\"reference internal\" href=\"/fr/4.1/topics/db/queries/\"><span class=\"doc\">Création de requêtes</span></a>; ce document aborde spécifiquement les options de modèles qui personnalisent le comportement des gestionnaires.</p>\n<section id=\"manager-names\">\n<span id=\"id1\"></span><h2>Noms des gestionnaires<a class=\"heading-anchor\" href=\"#manager-names\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Par défaut, Django ajoute un gestionnaire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> à chaque classe de modèle Django. Cependant, si vous aimeriez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> comme nom de champ ou que vous aimeriez nommer le gestionnaire autrement que <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>, vous pouvez le renommer au niveau du modèle. Pour renommer le gestionnaire d’une classe donnée, définissez un attribut de classe de type <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Manager()</span></code> dans le modèle. Par 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=\"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\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\">#...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>En utilisant cet exemple de modèle, <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects</span></code> générera une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code>, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> fournira effectivement la liste de tous les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>.</p>\n</section>\n<section id=\"custom-managers\">\n<span id=\"id2\"></span><h2>Gestionnaires personnalisés<a class=\"heading-anchor\" href=\"#custom-managers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vous pouvez utiliser un gestionnaire personnalisé dans un modèle particulier en étendant la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> de base et en créant votre propre instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dans votre modèle.</p>\n<p>Il y a deux raisons de vouloir personnaliser un gestionnaire : pour lui ajouter des méthodes supplémentaires ou pour modifier l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> initial que le gestionnaire renvoie.</p>\n<section id=\"adding-extra-manager-methods\">\n<h3>Ajout de méthodes de gestionnaire supplémentaires<a class=\"heading-anchor\" href=\"#adding-extra-manager-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’ajout de méthodes de gestionnaire supplémentaires est la façon privilégiée d’ajouter des fonctionnalités au « niveau table » à des modèles (pour les fonctionnalités au « niveau ligne », c’est-à-dire les fonctions qui agissent sur une seule instance d’un objet de modèle, utilisez les <a class=\"reference internal\" href=\"/fr/4.1/topics/db/models/#model-methods\"><span class=\"std std-ref\">méthodes de modèles</span></a> et non pas des méthodes de gestionnaire personnalisées).</p>\n<p>Par exemple, ce <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> personnalisé ajoute une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">with_counts()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Coalesce</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">with_counts</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n            <span class=\"n\">num_responses</span><span class=\"o\">=</span><span class=\"n\">Coalesce</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;response&quot;</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n        <span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OpinionPoll</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\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PollManager</span><span class=\"p\">()</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Response</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\">poll</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\">OpinionPoll</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>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>Avec cet exemple, vous écririez <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll.objects.with_counts()</span></code> pour obtenir un jeu <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> d’objets <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll</span></code> comportant l’attribut supplémentaire <code class=\"docutils literal notranslate\"><span class=\"pre\">num_responses</span></code>.</p>\n<p>Une méthode de gestionnaire personnalisée peut renvoyer tout ce qu’on veut, elle n’est pas tenue de renvoyer un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Une autre chose à relever est que les méthodes de gestionnaire ont accès à <code class=\"docutils literal notranslate\"><span class=\"pre\">self.model</span></code> pour obtenir la classe de modèle à laquelle elles sont liées.</p>\n</section>\n<section id=\"modifying-a-manager-s-initial-queryset\">\n<h3>Modification des <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> initiaux des gestionnaires<a class=\"heading-anchor\" href=\"#modifying-a-manager-s-initial-queryset\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> de base d’un gestionnaire renvoie tous les objets du système. Par exemple, en utilisant ce modèle :</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\">Book</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\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…l’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> renvoie tous les livres de la base de données.</p>\n<p>Vous pouvez surcharger le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> de base d’un gestionnaire en surchargeant la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.get_queryset()</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> doit renvoyer un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> doté des propriétés nécessaires.</p>\n<p>Par exemple, le modèle suivant possède <em>deux</em> gestionnaires, un qui renvoie tous les objets et un autre qui ne renvoie que les livres de Roald Dahl :</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=\"c1\"># First, define the Manager subclass.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DahlBookManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s1\">&#39;Roald Dahl&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Then hook it into the Book model explicitly.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</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\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span> <span class=\"c1\"># The default manager.</span>\n    <span class=\"n\">dahl_objects</span> <span class=\"o\">=</span> <span class=\"n\">DahlBookManager</span><span class=\"p\">()</span> <span class=\"c1\"># The Dahl-specific manager.</span>\n</code></pre></div>\n<p>Avec cet exemple de modèle, <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> renvoie tous les livres de la base de données, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.dahl_objects.all()</span></code> ne retourne que ceux qui ont été écrits par Roald Dahl.</p>\n<p>Comme <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> renvoie un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, vous pouvez appliquer <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> et toutes les autres méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Ainsi, ces instructions sont toutes valables :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;Matilda&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Cet exemple a aussi mis en évidence une autre technique intéressante : l’emploi de plusieurs gestionnaires dans un même modèle. Vous pouvez lier autant d’instances de gestionnaires que vous voulez à un modèle. C’est une manière non répétitive de définir des « filtres » fréquemment utilisés dans des modèles.</p>\n<p>Par 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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s1\">&#39;A&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EditorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Author&#39;</span><span class=\"p\">)),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Editor&#39;</span><span class=\"p\">))])</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">AuthorManager</span><span class=\"p\">()</span>\n    <span class=\"n\">editors</span> <span class=\"o\">=</span> <span class=\"n\">EditorManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Cet exemple permet d’effectuer les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.authors.all()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.editors.all()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> en sachant à quoi vous attendre au niveau des résultats.</p>\n</section>\n<section id=\"default-managers\">\n<span id=\"id3\"></span><h3>Gestionnaires par défaut<a class=\"heading-anchor\" href=\"#default-managers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._default_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_default_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._default_manager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si vous utilisez des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> personnalisés, sachez que le premier <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> que Django rencontre (dans l’ordre où ils ont été définis dans le modèle) reçoit un statut spécial. Django interprète le premier gestionnaire défini dans une classe comme le gestionnaire par défaut, et plusieurs parties de Django (y compris <a class=\"reference internal\" href=\"/fr/4.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a>) utilisent exclusivement ce gestionnaire pour le modèle en question. En conséquence, il est conseillé de choisir avec prudence le gestionnaire par défaut afin d’éviter une situation où la surcharge de <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> aboutit à l’incapacité de récupérer des objets avec lesquels vous avez besoin de travailler.</p>\n<p>Vous pouvez définir un gestionnaire par défaut personnalisé en utilisant <a class=\"reference internal\" href=\"/fr/4.1/ref/models/options/#django.db.models.Options.default_manager_name\" title=\"django.db.models.Options.default_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span></code></a>.</p>\n<p>Si par exemple vous écrivez du code qui doit gérer un modèle inconnu dans une application tierce qui implémente une vue générique, utilisez ce gestionnaire (ou <a class=\"reference internal\" href=\"#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a>) plutôt que de supposer que le modèle possède un gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>.</p>\n</section>\n<section id=\"base-managers\">\n<h3>Gestionnaires de base<a class=\"heading-anchor\" href=\"#base-managers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._base_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_base_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._base_manager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<section id=\"using-managers-for-related-object-access\">\n<span id=\"managers-for-related-objects\"></span><h4>Utilisation de gestionnaires pour accéder aux objets liés<a class=\"heading-anchor\" href=\"#using-managers-for-related-object-access\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Par défaut, Django utilise une instance de classe de gestionnaire  <code class=\"docutils literal notranslate\"><span class=\"pre\">Model._base_manager</span></code> pour accéder aux objets liés (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">choice.question</span></code>), et non pas le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code> de l’objet lié. Ceci parce que Django doit absolument être capable de récupérer l’objet lié, même dans les cas où il serait filtré (et donc inaccessible) par son gestionnaire par défaut.</p>\n<p>Si la classe de gestionnaire de base (<a class=\"reference internal\" href=\"#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Manager</span></code></a>) ne convient pas dans un cas particulier, vous pouvez dire à Django quelle classe utiliser en définissant <a class=\"reference internal\" href=\"/fr/4.1/ref/models/options/#django.db.models.Options.base_manager_name\" title=\"django.db.models.Options.base_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.base_manager_name</span></code></a>.</p>\n<p>Les gestionnaires de base ne sont pas utilisés lors de requêtes à partir de modèles liés ou lors d’accès aux <a class=\"reference internal\" href=\"/fr/4.1/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">relations un-à-un ou plusieurs-à-plusieurs</span></a>. Par exemple, si le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> <a class=\"reference internal\" href=\"/fr/4.1/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">du tutoriel</span></a> avait un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted</span></code> et un gestionnaire de base qui excluait les instances ayant <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted=True</span></code>, une requête telle que <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice.objects.filter(question__name__startswith='What')</span></code> inclurait aussi les choix liés aux questions supprimées.</p>\n</section>\n<section id=\"don-t-filter-away-any-results-in-this-type-of-manager-subclass\">\n<h4>Ne jamais filtrer les résultats dans ce type de sous-classe de gestionnaire<a class=\"heading-anchor\" href=\"#don-t-filter-away-any-results-in-this-type-of-manager-subclass\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Ce gestionnaire est utilisé pour accéder aux objets liés à partir d’un autre modèle. Dans ces situations, Django doit être capable de voir tous les objets du modèle qu’il récupère, afin que <em>tout</em> ce qui est référencé puisse être récupéré.</p>\n<p>Pour cette raison, vous ne devez pas surcharger <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> pour exclure certaines lignes. Si vous le faites, Django renverra des résultats incomplets.</p>\n</section>\n</section>\n<section id=\"calling-custom-queryset-methods-from-the-manager\">\n<span id=\"calling-custom-queryset-methods-from-manager\"></span><h3>Appel personnalisé de méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> depuis le gestionnaire<a class=\"heading-anchor\" href=\"#calling-custom-queryset-methods-from-the-manager\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Alors que la plupart des méthodes d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> standard sont directement accessibles à partir d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, ce n’est le cas pour les méthodes supplémentaires définies sur un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> personnalisé que si vous les implémentez également sur le <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s1\">&#39;A&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">using</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">editors</span><span class=\"p\">()</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Author&#39;</span><span class=\"p\">)),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Editor&#39;</span><span class=\"p\">))])</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Cet exemple permet d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">authors()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">editors()</span></code> directement depuis le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people</span></code>.</p>\n</section>\n<section id=\"creating-a-manager-with-queryset-methods\">\n<span id=\"create-manager-with-queryset-methods\"></span><h3>Création d’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> avec des méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#creating-a-manager-with-queryset-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>En lieu et place de l’approche ci-dessus qui nécessite de dupliquer les méthodes à la fois sur les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>,  <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> peut être utilisé pour créer une instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> avec une copie des méthodes d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> personnalisé :</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\">Person</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=\"o\">...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonQuerySet</span><span class=\"o\">.</span><span class=\"n\">as_manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>L’instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> créée par <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> sera pratiquement identique au <code class=\"docutils literal notranslate\"><span class=\"pre\">PersonManager</span></code> de l’exemple précédent.</p>\n<p>Toutes les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> n’ont pas forcément de sens au niveau <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>; par exemple, nous empêchons volontairement la méthode <a class=\"reference internal\" href=\"/fr/4.1/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> d’être copiée vers la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>.</p>\n<p>Les méthodes sont copiées selon les règles suivantes :</p>\n<ul class=\"simple\">\n<li><p>Les méthodes publiques sont copiées par défaut.</p></li>\n<li><p>Les méthodes privées (commençant par un soulignement) ne sont pas copiées par défaut.</p></li>\n<li><p>Les méthodes avec un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> sont toujours copiées.</p></li>\n<li><p>Les méthodes avec un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ne sont jamais copiées.</p></li>\n</ul>\n<p>Par 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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">opted_out_public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n    <span class=\"n\">opted_out_public_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_opted_in_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n    <span class=\"n\">_opted_in_private_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<section id=\"from-queryset\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">from_queryset()</span></code><a class=\"heading-anchor\" href=\"#from-queryset\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.from_queryset\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">from_queryset</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">queryset_class</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.from_queryset\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Pour une utilisation plus avancée, il peut être souhaitable d’avoir à la fois un <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> personnalisé et un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> personnalisé. Vous pouvez le faire en appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.from_queryset()</span></code> qui renvoie une <em>sous-classe</em> du <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> de base avec une copie des méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> personnalisées :</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\">CustomManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_only_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_and_queryset_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</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\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)()</span>\n</code></pre></div>\n<p>Vous pouvez également stocker la classe générée dans une variable :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MyManager</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</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\">objects</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"custom-managers-and-model-inheritance\">\n<span id=\"custom-managers-and-inheritance\"></span><h3>Gestionnaires personnalisés et héritage de modèle<a class=\"heading-anchor\" href=\"#custom-managers-and-model-inheritance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Voici comment Django gère les gestionnaires personnalisés dans le contexte <a class=\"reference internal\" href=\"/fr/4.1/topics/db/models/#model-inheritance\"><span class=\"std std-ref\">d’héritage des modèles</span></a>:</p>\n<ol class=\"arabic simple\">\n<li><p>Les gestionnaires des classes de base sont toujours hérités par les classes enfants, par le moyen Python habituel de l’ordre de résolution de nom (les noms des classes enfants surchargent ceux de leurs parents).</p></li>\n<li><p>Si aucun gestionnaire n’est déclaré dans un modèle ou dans ses parents, Django crée automatiquement le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>.</p></li>\n<li><p>Le gestionnaire par défaut d’une classe est soit celui qui est choisi par <a class=\"reference internal\" href=\"/fr/4.1/ref/models/options/#django.db.models.Options.default_manager_name\" title=\"django.db.models.Options.default_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span></code></a>, soit le premier gestionnaire déclaré dans le modèle, soit le gestionnaire par défaut du premier modèle parent.</p></li>\n</ol>\n<p>Ces règles assurent la souplesse nécessaire permettant d’installer un ensemble de gestionnaires personnalisés sur un groupe de modèles via une classe de base abstraite, tout en personnalisant aussi le gestionnaire par défaut. Prenons l’exemple de cette classe de base :</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\">AbstractBase</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>Si vous l’utilisez directement dans une sous-classe, <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> sera le gestionnaire par défaut si aucun gestionnaire n’est déclaré dans la classe de base :</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\">ChildA</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># This class has CustomManager as the default manager.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Si vous voulez hériter de <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>, mais avec un autre gestionnaire par défaut, vous pouvez définir le gestionnaire par défaut dans la classe enfant :</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\">ChildB</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># An explicit default manager.</span>\n    <span class=\"n\">default_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Ici, <code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager</span></code> est le gestionnaire par défaut. Le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> est toujours disponible, puisqu’il est hérité, mais il n’est plus le gestionnaire par défaut.</p>\n<p>Pour terminer avec cet exemple, supposons que vous vouliez ajouter des gestionnaires supplémentaires dans la classe enfant tout en conservant le gestionnaire par défaut de <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>. Vous ne pouvez pas ajouter directement le nouveau gestionnaire dans la classe enfant, car cela surchargerait le gestionnaire par défaut et vous devriez aussi inclure explicitement tous les gestionnaires de la classe de base abstraite. La solution est de placer les gestionnaires supplémentaires dans une autre classe de base et introduire celle-ci dans la hiérarchie d’héritage <em>après</em> ceux par défaut :</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\">ExtraManager</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\">extra_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildC</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">,</span> <span class=\"n\">ExtraManager</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># Default manager is CustomManager, but OtherManager is</span>\n    <span class=\"c1\"># also available via the &quot;extra_manager&quot; attribute.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Notez que même si vous pouvez <em>définir</em> un gestionnaire personnalisé dans le modèle abstrait, vous ne pouvez <em>appeler</em> aucune de ses méthodes au travers du modèle abstrait. 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=\"n\">ClassA</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>est légal, mais :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AbstractBase</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>générera une exception. C’est parce que les gestionnaires sont censés intégrer la logique de gestion d’ensembles d’objets. Comme il n’est pas possible d’avoir un ensemble d’objets abstraits, leur gestion n’a pas de sens. Si vous gérez des fonctionnalités s’appliquant au modèle abstrait, vous devriez les placer dans une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">staticmethod</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">classmethod</span></code> du modèle abstrait.</p>\n</section>\n<section id=\"implementation-concerns\">\n<h3>Détails d’implémentation<a class=\"heading-anchor\" href=\"#implementation-concerns\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Quelles que soient les fonctionnalités ajoutées à un gestionnaire personnalisé, il doit toujours être possible de faire une copie légère (« shallow ») d’une de ses instances ; c’est-à-dire que le code suivant doit fonctionner :</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">copy</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">manager</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">my_copy</span> <span class=\"o\">=</span> <span class=\"n\">copy</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">manager</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Django effectue des copies légères des objets de gestionnaire durant certaines requêtes ; si votre gestionnaire ne peut pas être copié, ces requêtes échoueront.</p>\n<p>Ce ne sera pas un problème pour la plupart des gestionnaires personnalisés. Si vous ne faites qu’ajouter des méthodes simples à votre classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, il est improbable que vous empêchiez la copie de votre gestionnaire sans le vouloir. Cependant, si vous surchargez <code class=\"docutils literal notranslate\"><span class=\"pre\">__getattr__</span></code> ou d’autres méthodes privées de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> qui contrôlent l’état de l’objet, il faut vous assurer que vous n’altériez pas la capacité de votre gestionnaire d’être copié.</p>\n</section>\n</section>","rootId":"managers","toc":[{"title":"Noms des gestionnaires","anchor":"manager-names","children":[]},{"title":"Gestionnaires personnalisés","anchor":"custom-managers","children":[{"title":"Ajout de méthodes de gestionnaire supplémentaires","anchor":"adding-extra-manager-methods","children":[]},{"title":"Modification des QuerySet initiaux des gestionnaires","anchor":"modifying-a-manager-s-initial-queryset","children":[]},{"title":"Gestionnaires par défaut","anchor":"default-managers","children":[]},{"title":"Gestionnaires de base","anchor":"base-managers","children":[{"title":"Utilisation de gestionnaires pour accéder aux objets liés","anchor":"using-managers-for-related-object-access","children":[]},{"title":"Ne jamais filtrer les résultats dans ce type de sous-classe de gestionnaire","anchor":"don-t-filter-away-any-results-in-this-type-of-manager-subclass","children":[]}]},{"title":"Appel personnalisé de méthodes QuerySet depuis le gestionnaire","anchor":"calling-custom-queryset-methods-from-the-manager","children":[]},{"title":"Création d’objet Manager avec des méthodes de QuerySet","anchor":"creating-a-manager-with-queryset-methods","children":[{"title":"from_queryset()","anchor":"from-queryset","children":[]}]},{"title":"Gestionnaires personnalisés et héritage de modèle","anchor":"custom-managers-and-model-inheritance","children":[]},{"title":"Détails d’implémentation","anchor":"implementation-concerns","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/4.1/topics/"},{"docname":"topics/db/index","title":"Modèles et bases de données","url":"/fr/4.1/topics/db/"}],"prev":{"docname":"topics/db/search","title":"Recherche","url":"/fr/4.1/topics/db/search/"},"next":{"docname":"topics/db/sql","title":"Lancement de requêtes SQL brutes","url":"/fr/4.1/topics/db/sql/"},"formats":{"html":"/fr/4.1/topics/db/managers/","markdown":"/fr/4.1/topics/db/managers.md","json":"/fr/4.1/topics/db/managers.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/topics/db/managers.txt","official":"https://docs.djangoproject.com/fr/4.1/topics/db/managers/","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"]}