{"title":"Fetch modes","version":"6.1","locale":"fr","docname":"topics/db/fetch-modes","url":"/fr/6.1/topics/db/fetch-modes/","canonical":"https://djangodocs.dev/fr/6.1/topics/db/fetch-modes/","summary":"New in Django 6.1 When accessing model fields that were not loaded as part of the original query, Django will fetch that field’s data from the database. You can…","html":"<h1>Fetch modes<a class=\"heading-anchor\" href=\"#fetch-modes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p id=\"module-django.db.models.fetch_modes\">When accessing model fields that were not loaded as part of the original query,\nDjango will fetch that field’s data from the database. You can customize the\nbehavior of this fetching with a <strong>fetch mode</strong>, making it more efficient or\neven blocking it.</p>\n<p>Use <a class=\"reference internal\" href=\"/fr/6.1/ref/models/querysets/#django.db.models.query.QuerySet.fetch_mode\" title=\"django.db.models.query.QuerySet.fetch_mode\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.fetch_mode()</span></code></a> to set the fetch mode for model\ninstances fetched by a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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=\"n\">books</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">fetch_mode</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FETCH_PEERS</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Fetch modes apply to:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/6.1/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> fields</p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/6.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> fields and their reverse accessors</p></li>\n<li><p>Fields deferred with <a class=\"reference internal\" href=\"/fr/6.1/ref/models/querysets/#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.defer()</span></code></a> or <a class=\"reference internal\" href=\"/fr/6.1/ref/models/querysets/#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.only()</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/contenttypes/#generic-relations\"><span class=\"std std-ref\">Relations génériques</span></a></p></li>\n</ul>\n<p>Django copies the fetch mode of an instance to any related objects it fetches,\nso the mode applies to a whole tree of relationships, not just the top-level\nmodel in the initial <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. This copying is also done in related\nmanagers, even though fetch modes don’t affect such managers” queries.</p>\n<section id=\"available-modes\">\n<h2>Available modes<a class=\"heading-anchor\" href=\"#available-modes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-referencing-fetch-modes admonition\">\n<p class=\"admonition-title\">Referencing fetch modes</p>\n<p>Fetch modes are defined in <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.fetch_modes</span></code>, but for\nconvenience they’re imported into <a class=\"reference internal\" href=\"/fr/6.1/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.models</span></code></a>. The standard\nconvention is to use <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">django.db</span> <span class=\"pre\">import</span> <span class=\"pre\">models</span></code> and refer to the\nfetch modes as <code class=\"docutils literal notranslate\"><span class=\"pre\">models.&lt;mode&gt;</span></code>.</p>\n</aside>\n<p>Django provides three fetch modes. We’ll explain them below using these models:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\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\">author</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\">Author</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=\"o\">...</span>\n</code></pre></div>\n<p>…and this loop:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">for</span> <span class=\"n\">book</span> <span class=\"ow\">in</span> <span class=\"n\">books</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…where <code class=\"docutils literal notranslate\"><span class=\"pre\">books</span></code> is a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> of <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> instances using some fetch mode.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FETCH_ONE\">\n<span class=\"sig-name descname\"><span class=\"pre\">FETCH_ONE</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_ONE\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fetches the missing field for the current instance only. This is the default\nmode.</p>\n<p>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_ONE</span></code> for the above example would use:</p>\n<ul class=\"simple\">\n<li><p>1 query to fetch <code class=\"docutils literal notranslate\"><span class=\"pre\">books</span></code></p></li>\n<li><p>N queries, where N is the number of books, to fetch the missing <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code>\nfield</p></li>\n</ul>\n<p>…for a total of 1+N queries. This query pattern is known as the « N+1 queries\nproblem » because it often leads to performance issues when N is large.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FETCH_PEERS\">\n<span class=\"sig-name descname\"><span class=\"pre\">FETCH_PEERS</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_PEERS\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fetches the missing field for the current instance and its « peers »—instances\nthat came from the same initial <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. The behavior of this mode is\nbased on the assumption that if you need a field for one instance, you probably\nneed it for all instances in the same batch, since you’ll likely process them\nall identically.</p>\n<p>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_PEERS</span></code> for the above example would use:</p>\n<ul class=\"simple\">\n<li><p>1 query to fetch <code class=\"docutils literal notranslate\"><span class=\"pre\">books</span></code></p></li>\n<li><p>1 query to fetch all missing <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> fields for the batch of books</p></li>\n</ul>\n<p>…for a total of 2 queries. The batch query makes this mode a lot more efficient\nthan <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_ONE</span></code> and is similar to an on-demand call to\n<a class=\"reference internal\" href=\"/fr/6.1/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\">QuerySet.prefetch_related()</span></code></a> or\n<a class=\"reference internal\" href=\"/fr/6.1/ref/models/querysets/#django.db.models.prefetch_related_objects\" title=\"django.db.models.prefetch_related_objects\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code></a>. Using <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_PEERS</span></code> can\nreduce most cases of the « N+1 queries problem » to two queries without\nmuch effort.</p>\n<p>The « peer » instances are tracked in a list of weak references, to avoid\nmemory leaks where some peer instances are discarded.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FETCH_RAISE\">\n<span class=\"sig-name descname\"><span class=\"pre\">FETCH_RAISE</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_RAISE\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Raises a <a class=\"reference internal\" href=\"/fr/6.1/ref/exceptions/#django.core.exceptions.FieldFetchBlocked\" title=\"django.core.exceptions.FieldFetchBlocked\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">FieldFetchBlocked</span></code></a> exception.</p>\n<p>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_RAISE</span></code> for the above example would raise an exception at the\naccess of <code class=\"docutils literal notranslate\"><span class=\"pre\">book.author</span></code>, like:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"n\">FieldFetchBlocked</span><span class=\"p\">(</span><span class=\"s2\">&quot;Fetching of Primary.value blocked.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This mode can prevent unintentional queries in performance-critical\nsections of code.</p>\n</section>\n<section id=\"make-a-fetch-mode-the-default-for-a-model-class\">\n<span id=\"fetch-modes-custom-manager\"></span><h2>Make a fetch mode the default for a model class<a class=\"heading-anchor\" href=\"#make-a-fetch-mode-the-default-for-a-model-class\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Set the default fetch mode for a model class with a\n<a class=\"reference internal\" href=\"/fr/6.1/topics/db/managers/#custom-managers\"><span class=\"std std-ref\">custom manager</span></a> that overrides <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookManager</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\">fetch_mode</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FETCH_PEERS</span><span class=\"p\">)</span>\n\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\">TextField</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\">ForeignKey</span><span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</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\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">BookManager</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>","rootId":"fetch-modes","toc":[{"title":"Available modes","anchor":"available-modes","children":[]},{"title":"Make a fetch mode the default for a model class","anchor":"make-a-fetch-mode-the-default-for-a-model-class","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/6.1/topics/"},{"docname":"topics/db/index","title":"Modèles et bases de données","url":"/fr/6.1/topics/db/"}],"prev":{"docname":"topics/db/queries","title":"Création de requêtes","url":"/fr/6.1/topics/db/queries/"},"next":{"docname":"topics/db/aggregation","title":"Agrégation","url":"/fr/6.1/topics/db/aggregation/"},"formats":{"html":"/fr/6.1/topics/db/fetch-modes/","markdown":"/fr/6.1/topics/db/fetch-modes.md","json":"/fr/6.1/topics/db/fetch-modes.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/fetch-modes.txt","official":"https://docs.djangoproject.com/fr/6.1/topics/db/fetch-modes/","inVersions":["6.1"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}