{"title":"Fetch modes","version":"6.1","locale":"es","docname":"topics/db/fetch-modes","url":"/es/6.1/topics/db/fetch-modes/","canonical":"https://djangodocs.dev/es/6.1/topics/db/fetch-modes/","summary":"When accessing model fields that were not loaded as part of the original query, Django will fetch that field’s data from the database.","html":"<h1>Fetch modes<a class=\"heading-anchor\" href=\"#fetch-modes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"6.1\" role=\"note\">\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=\"/es/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\">QuerySet.fetch_mode()</code></a> to set the fetch mode for model\ninstances fetched by a <code class=\"docutils literal notranslate\">QuerySet</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\nbooks <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>fetch_mode<span class=\"p\">(</span>models<span class=\"o\">.</span>FETCH_PEERS<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=\"/es/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> fields</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/6.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> fields and their reverse accessors</p></li>\n<li><p>Fields deferred with <a class=\"reference internal\" href=\"/es/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\">QuerySet.defer()</code></a> or <a class=\"reference internal\" href=\"/es/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\">QuerySet.only()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/6.1/ref/contrib/contenttypes/#generic-relations\"><span class=\"std std-ref\">Generic relations</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\">QuerySet</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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-referencing-fetch-modes admonition\" role=\"note\">\n<p class=\"admonition-title\">Referencing fetch modes</p>\n<p>Fetch modes are defined in <code class=\"docutils literal notranslate\">django.db.models.fetch_modes</code>, but for\nconvenience they’re imported into <a class=\"reference internal\" href=\"/es/6.1/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models</code></a>. The standard\nconvention is to use <code class=\"docutils literal notranslate\">from django.db import models</code> and refer to the\nfetch modes as <code class=\"docutils literal notranslate\">models.&lt;mode&gt;</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Author<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<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> book <span class=\"ow\">in</span> books<span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span>book<span class=\"o\">.</span>author<span class=\"o\">.</span>name<span class=\"p\">)</span>\n</code></pre></div>\n<p>…where <code class=\"docutils literal notranslate\">books</code> is a <code class=\"docutils literal notranslate\">QuerySet</code> of <code class=\"docutils literal notranslate\">Book</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\">FETCH_ONE</span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_ONE\"><span class=\"visually-hidden\">Link to this definition</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\">FETCH_ONE</code> for the above example would use:</p>\n<ul class=\"simple\">\n<li><p>1 query to fetch <code class=\"docutils literal notranslate\">books</code></p></li>\n<li><p>N queries, where N is the number of books, to fetch the missing <code class=\"docutils literal notranslate\">author</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\">FETCH_PEERS</span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_PEERS\"><span class=\"visually-hidden\">Link to this definition</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\">QuerySet</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\">FETCH_PEERS</code> for the above example would use:</p>\n<ul class=\"simple\">\n<li><p>1 query to fetch <code class=\"docutils literal notranslate\">books</code></p></li>\n<li><p>1 query to fetch all missing <code class=\"docutils literal notranslate\">author</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\">FETCH_ONE</code> and is similar to an on-demand call to\n<a class=\"reference internal\" href=\"/es/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\">QuerySet.prefetch_related()</code></a> or\n<a class=\"reference internal\" href=\"/es/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\">prefetch_related_objects()</code></a>. Using <code class=\"docutils literal notranslate\">FETCH_PEERS</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\">FETCH_RAISE</span><a class=\"heading-anchor\" href=\"#django.db.models.FETCH_RAISE\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Raises a <a class=\"reference internal\" href=\"/es/6.1/ref/exceptions/#django.core.exceptions.FieldFetchBlocked\" title=\"django.core.exceptions.FieldFetchBlocked\"><code class=\"xref py py-exc docutils literal notranslate\">FieldFetchBlocked</code></a> exception.</p>\n<p>Using <code class=\"docutils literal notranslate\">FETCH_RAISE</code> for the above example would raise an exception at the\naccess of <code class=\"docutils literal notranslate\">book.author</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>FieldFetchBlocked<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\">Link to this heading</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=\"/es/6.1/topics/db/managers/#custom-managers\"><span class=\"std std-ref\">custom manager</span></a> that overrides <code class=\"docutils literal notranslate\">get_queryset()</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BookManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>fetch_mode<span class=\"p\">(</span>models<span class=\"o\">.</span>FETCH_PEERS<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n\n    objects <span class=\"o\">=</span> BookManager<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":"Using Django","url":"/es/6.1/topics/"},{"docname":"topics/db/index","title":"Models and databases","url":"/es/6.1/topics/db/"}],"prev":{"docname":"topics/db/queries","title":"Making queries","url":"/es/6.1/topics/db/queries/"},"next":{"docname":"topics/db/aggregation","title":"Agregación","url":"/es/6.1/topics/db/aggregation/"},"formats":{"html":"/es/6.1/topics/db/fetch-modes/","markdown":"/es/6.1/topics/db/fetch-modes.md","json":"/es/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/es/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"]}