{"title":"Hämtningslägen","version":"6.1","locale":"sv","docname":"topics/db/fetch-modes","url":"/sv/6.1/topics/db/fetch-modes/","canonical":"https://djangodocs.dev/sv/6.1/topics/db/fetch-modes/","summary":"När du använder modellfält som inte lästes in som en del av den ursprungliga frågan hämtar Django fältets data från databasen.","html":"<h1>Hämtningslägen<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\">När du använder modellfält som inte lästes in som en del av den ursprungliga frågan hämtar Django fältets data från databasen. Du kan anpassa hur denna hämtning fungerar med ett <strong>hämtningsläge</strong>, för att göra den mer effektiv eller till och med blockera den.</p>\n<p>Använd <a class=\"reference internal\" href=\"/sv/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> för att ange hämtningsläge för modellinstanser som hämtas av en <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>Hämtningslägen gäller för:</p>\n<ul class=\"simple\">\n<li><p>Fält av typen <a class=\"reference internal\" href=\"/sv/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></p></li>\n<li><p>Fält av typen <a class=\"reference internal\" href=\"/sv/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> och deras omvända åtkomstfunktioner</p></li>\n<li><p>Fält som skjutits upp med <a class=\"reference internal\" href=\"/sv/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> eller <a class=\"reference internal\" href=\"/sv/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=\"/sv/6.1/ref/contrib/contenttypes/#generic-relations\"><span class=\"std std-ref\">Generiska relationer</span></a></p></li>\n</ul>\n<p>Django kopierar hämtningsläget för en instans till alla relaterade objekt som det hämtar, så läget gäller för ett helt relationsträd, inte bara för toppnivåmodellen i den ursprungliga <code class=\"docutils literal notranslate\">QuerySet</code>. Kopieringen görs också i relationshanterare, även om hämtningslägen inte påverkar dessa hanterares frågor.</p>\n<section id=\"available-modes\">\n<h2>Tillgängliga lägen<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\">Referera till hämtningslägen</p>\n<p>Hämtningslägen definieras i <code class=\"docutils literal notranslate\">django.db.models.fetch_modes</code>, men av praktiska skäl importeras de till <a class=\"reference internal\" href=\"/sv/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>. Standardkonventionen är att använda <code class=\"docutils literal notranslate\">from django.db import models</code> och referera till hämtningslägen som <code class=\"docutils literal notranslate\">models.&lt;mode&gt;</code>.</p>\n</aside>\n<p>Django tillhandahåller tre hämtningslägen. Vi förklarar dem nedan med hjälp av dessa modeller:</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>…och den här loopen:</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>…där <code class=\"docutils literal notranslate\">books</code> är en <code class=\"docutils literal notranslate\">QuerySet</code> med <code class=\"docutils literal notranslate\">Book</code>-instanser som använder något hämtningsläge.</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>Hämtar det saknade fältet endast för den aktuella instansen. Detta är standardläget.</p>\n<p>Om du använder <code class=\"docutils literal notranslate\">FETCH_ONE</code> för exemplet ovan används:</p>\n<ul class=\"simple\">\n<li><p>1 fråga för att hämta <code class=\"docutils literal notranslate\">books</code></p></li>\n<li><p>N frågor, där N är antalet böcker, för att hämta det saknade fältet <code class=\"docutils literal notranslate\">author</code></p></li>\n</ul>\n<p>…vilket ger totalt 1+N frågor. Detta frågemönster kallas ”N+1-frågeproblemet” eftersom det ofta leder till prestandaproblem när N är stort.</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>Hämtar det saknade fältet för den aktuella instansen och dess ”peer”-instanser – instanser som kom från samma ursprungliga <code class=\"docutils literal notranslate\">QuerySet</code>. Lägets beteende bygger på antagandet att om du behöver ett fält för en instans behöver du förmodligen det för alla instanser i samma grupp, eftersom du troligen kommer att behandla dem på samma sätt.</p>\n<p>Om du använder <code class=\"docutils literal notranslate\">FETCH_PEERS</code> för exemplet ovan används:</p>\n<ul class=\"simple\">\n<li><p>1 fråga för att hämta <code class=\"docutils literal notranslate\">books</code></p></li>\n<li><p>1 fråga för att hämta alla saknade fält <code class=\"docutils literal notranslate\">author</code> för gruppen av böcker</p></li>\n</ul>\n<p>…vilket ger totalt 2 frågor. Gruppfrågan gör det här läget mycket effektivare än <code class=\"docutils literal notranslate\">FETCH_ONE</code> och liknar ett anrop vid behov till <a class=\"reference internal\" href=\"/sv/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> eller <a class=\"reference internal\" href=\"/sv/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>. Användning av <code class=\"docutils literal notranslate\">FETCH_PEERS</code> kan med liten ansträngning minska de flesta fall av ”N+1-frågeproblemet” till två frågor.</p>\n<p>”Peer”-instanserna spåras i en lista med svaga referenser, för att undvika minnesläckor när vissa peer-instanser kasseras.</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>Utlöser undantaget <a class=\"reference internal\" href=\"/sv/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>.</p>\n<p>Om du använder <code class=\"docutils literal notranslate\">FETCH_RAISE</code> för exemplet ovan utlöses ett undantag när <code class=\"docutils literal notranslate\">book.author</code> används, så här:</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>Detta läge kan förhindra oavsiktliga frågor i prestandakritiska delar av koden.</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>Gör ett hämtningsläge till standard för en modellklass<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>Ange standardhämtningsläge för en modellklass med en <a class=\"reference internal\" href=\"/sv/6.1/topics/db/managers/#custom-managers\"><span class=\"std std-ref\">anpassad hanterare</span></a> som åsidosätter <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":"Tillgängliga lägen","anchor":"available-modes","children":[]},{"title":"Gör ett hämtningsläge till standard för en modellklass","anchor":"make-a-fetch-mode-the-default-for-a-model-class","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"},{"docname":"topics/db/index","title":"Modeller och databaser","url":"/sv/6.1/topics/db/"}],"prev":{"docname":"topics/db/queries","title":"Göra förfrågningar","url":"/sv/6.1/topics/db/queries/"},"next":{"docname":"topics/db/aggregation","title":"Aggregering","url":"/sv/6.1/topics/db/aggregation/"},"formats":{"html":"/sv/6.1/topics/db/fetch-modes/","markdown":"/sv/6.1/topics/db/fetch-modes.md","json":"/sv/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/sv/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"]}