{"title":"Optimering av databasåtkomst","version":"6.1","locale":"sv","docname":"topics/db/optimization","url":"/sv/6.1/topics/db/optimization/","canonical":"https://djangodocs.dev/sv/6.1/topics/db/optimization/","summary":"Djangos databaslager tillhandahåller olika sätt att hjälpa utvecklare att få ut mesta möjliga av sina databaser. Detta dokument samlar länkar till relevant…","html":"<h1>Optimering av databasåtkomst<a class=\"heading-anchor\" href=\"#database-access-optimization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Djangos databaslager tillhandahåller olika sätt att hjälpa utvecklare att få ut mesta möjliga av sina databaser. Detta dokument samlar länkar till relevant dokumentation och lägger till olika tips, organiserade under ett antal rubriker som beskriver de steg som ska vidtas när du försöker optimera din databasanvändning.</p>\n<section id=\"profile-first\">\n<h2>Profil först<a class=\"heading-anchor\" href=\"#profile-first\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Som allmän programmeringspraxis säger detta sig självt. Ta reda på <a class=\"reference internal\" href=\"/sv/6.1/faq/models/#faq-see-raw-sql-queries\"><span class=\"std std-ref\">vilka frågor du gör och vad de kostar dig</span></a>. Använd <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.explain\" title=\"django.db.models.query.QuerySet.explain\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.explain()</span></code></a> för att förstå hur specifika <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> exekveras av din databas. Du kanske också vill använda ett externt projekt som <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-debug-toolbar/\">django-debug-toolbar</a>, eller ett verktyg som övervakar din databas direkt.</p>\n<p>Kom ihåg att du kan optimera för hastighet eller minne eller båda, beroende på dina krav. Ibland kan optimering för det ena vara till nackdel för det andra, men ibland kan de hjälpa varandra. Det arbete som utförs av databasprocessen kanske inte heller har samma kostnad (för dig) som samma mängd arbete som utförs i din Python-process. Det är upp till dig att bestämma vilka dina prioriteringar är, var balansen måste ligga och profilera alla dessa efter behov eftersom detta beror på din applikation och server.</p>\n<p>Med allt som följer, kom ihåg att profilera efter varje ändring för att säkerställa att ändringen är en fördel, och en tillräckligt stor fördel med tanke på minskningen av läsbarheten i din kod. <strong>Alla</strong> förslagen nedan kommer med förbehållet att den allmänna principen kanske inte gäller under dina omständigheter, eller kanske till och med är omvänd.</p>\n</section>\n<section id=\"use-standard-db-optimization-techniques\">\n<h2>Använda standardtekniker för DB-optimering<a class=\"heading-anchor\" href=\"#use-standard-db-optimization-techniques\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>…inklusive..:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Database_index\">Indexes</a>. This is a number one priority, <em>after</em> you have determined from\nprofiling what indexes should be added. Use\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.indexes\" title=\"django.db.models.Options.indexes\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.indexes</span></code></a> or\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.db_index</span></code></a> to add these from\nDjango. Consider adding indexes to fields that you frequently query using\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a>,\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a>,\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a>, etc. as indexes may help\nto speed up lookups. Note that determining the best indexes is a complex\ndatabase-dependent topic that will depend on your particular application.\nThe overhead of maintaining an index may outweigh any gains in query speed.</p></li>\n</ul>\n<ul class=\"simple\">\n<li><p>Lämplig användning av fälttyper.</p></li>\n</ul>\n<p>Vi kommer att anta att du har gjort de saker som anges ovan. Resten av detta dokument fokuserar på hur man använder Django på ett sådant sätt att man inte gör onödigt arbete. Detta dokument tar inte heller upp andra optimeringstekniker som gäller för alla dyra operationer, till exempel <a class=\"reference internal\" href=\"/sv/6.1/topics/cache/\"><span class=\"doc\">general purpose caching</span></a>.</p>\n</section>\n<section id=\"understand-querysets\">\n<h2>Förstå <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#understand-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Att förstå <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/\"><span class=\"doc\">QuerySets</span></a> är avgörande för att få bra prestanda med enkel kod. I synnerhet:</p>\n<section id=\"understand-queryset-evaluation\">\n<h3>Förstå utvärdering av <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#understand-queryset-evaluation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>För att undvika prestandaproblem är det viktigt att förstå:</p>\n<ul class=\"simple\">\n<li><p>att <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">QuerySets är lata</span></a>.</p></li>\n<li><p>när <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#when-querysets-are-evaluated\"><span class=\"std std-ref\">de utvärderas</span></a>.</p></li>\n<li><p>hur <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#caching-and-querysets\"><span class=\"std std-ref\">data lagras i minnet</span></a>.</p></li>\n</ul>\n</section>\n<section id=\"understand-cached-attributes\">\n<h3>Förstå cachelagrade attribut<a class=\"heading-anchor\" href=\"#understand-cached-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Förutom cachelagring av hela <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> finns det cachelagring av resultatet av attribut på ORM-objekt. I allmänhet kommer attribut som inte är anropsbara att cachelagras. Om vi till exempel antar att <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">example blog models</span></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span>  <span class=\"c1\"># Blog object is retrieved at this point</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span>  <span class=\"c1\"># cached version, no DB access</span>\n</code></pre></div>\n<p>Men i allmänhet orsakar anropsbara attribut DB-uppslagningar varje gång:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>  <span class=\"c1\"># query performed</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>  <span class=\"c1\"># query performed again</span>\n</code></pre></div>\n<p>Var försiktig när du läser mallkod - mallsystemet tillåter inte användning av parenteser, men kommer att kalla callables automatiskt, vilket döljer ovanstående distinktion.</p>\n<p>Var försiktig med dina egna anpassade egenskaper - det är upp till dig att implementera caching när det behövs, till exempel med hjälp av <a class=\"reference internal\" href=\"/sv/6.1/ref/utils/#django.utils.functional.cached_property\" title=\"django.utils.functional.cached_property\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cached_property</span></code></a>-dekoratorn.</p>\n</section>\n<section id=\"use-the-with-template-tag\">\n<h3>Använd malltaggen <code class=\"docutils literal notranslate\"><span class=\"pre\">with</span></code><a class=\"heading-anchor\" href=\"#use-the-with-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>För att utnyttja cachelagringsbeteendet hos <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> kan du behöva använda malltaggen <a class=\"reference internal\" href=\"/sv/6.1/ref/templates/builtins/#std-templatetag-with\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">with</span></code></a>.</p>\n</section>\n<section id=\"use-iterator\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code><a class=\"heading-anchor\" href=\"#use-iterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When you have a lot of objects, the caching behavior of the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> can\ncause a large amount of memory to be used. In this case,\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">iterator()</span></code></a> may help.</p>\n</section>\n<section id=\"use-explain\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">explain()</span></code><a class=\"heading-anchor\" href=\"#use-explain\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.explain\" title=\"django.db.models.query.QuerySet.explain\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.explain()</span></code></a> ger dig detaljerad information om hur databasen exekverar en fråga, inklusive index och sammanfogningar som används. Dessa detaljer kan hjälpa dig att hitta frågor som kan skrivas om på ett effektivare sätt eller identifiera index som kan läggas till för att förbättra prestandan.</p>\n</section>\n</section>\n<section id=\"do-database-work-in-the-database-rather-than-in-python\">\n<h2>Gör databasarbete i databasen snarare än i Python<a class=\"heading-anchor\" href=\"#do-database-work-in-the-database-rather-than-in-python\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Till exempel:</p>\n<ul class=\"simple\">\n<li><p>På den mest grundläggande nivån använder du <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#queryset-api\"><span class=\"std std-ref\">filter och exkludera</span></a> för att göra filtrering i databasen.</p></li>\n<li><p>Use <a class=\"reference internal\" href=\"/sv/6.1/ref/models/expressions/#f-expressions\"><span class=\"std std-ref\">F()-uttryck</span></a> to filter based on other fields within the same\nmodel.</p></li>\n<li><p>Använd <a class=\"reference internal\" href=\"/sv/6.1/topics/db/aggregation/\"><span class=\"doc\">annotate för att göra aggregering i databasen</span></a>.</p></li>\n</ul>\n<p>Om dessa inte räcker för att generera den SQL du behöver:</p>\n<section id=\"use-rawsql\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code><a class=\"heading-anchor\" href=\"#use-rawsql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>En mindre portabel men mer kraftfull metod är <a class=\"reference internal\" href=\"/sv/6.1/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a>-uttrycket, som gör att viss SQL uttryckligen kan läggas till i frågan. Om det fortfarande inte är tillräckligt kraftfullt:</p>\n</section>\n<section id=\"use-raw-sql\">\n<h3>Använd rå SQL<a class=\"heading-anchor\" href=\"#use-raw-sql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Skriv din egen <a class=\"reference internal\" href=\"/sv/6.1/topics/db/sql/\"><span class=\"doc\">custom SQL för att hämta data eller fylla i modeller</span></a>. Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.queries</span></code> för att ta reda på vad Django skriver åt dig och börja därifrån.</p>\n</section>\n</section>\n<section id=\"retrieve-individual-objects-using-a-unique-indexed-column\">\n<h2>Hämta enskilda objekt med hjälp av en unik, indexerad kolumn<a class=\"heading-anchor\" href=\"#retrieve-individual-objects-using-a-unique-indexed-column\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det finns två skäl att använda en kolumn med <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a> eller <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_index</span></code></a> när man använder <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> för att hämta enskilda objekt. För det första kommer frågan att vara snabbare på grund av det underliggande databasindexet. Dessutom kan frågan köras mycket långsammare om flera objekt matchar uppslagningen; att ha en unik begränsning på kolumnen garanterar att detta aldrig kommer att hända.</p>\n<p>Så med hjälp av <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">exempel på bloggmodeller</span></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>kommer att vara snabbare än:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;News Item Title&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> indexeras av databasen och garanterat är unik.</p>\n<p>Att göra följande är potentiellt ganska långsamt:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;News&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Först och främst är <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> inte indexerad, vilket gör att den underliggande databashämtningen blir långsammare.</p>\n<p>Second, the lookup may return multiple results. Even though Django applies a\nlimit of 21 objects when using <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>,\nthe database may still need to scan everything to evaluate a non-unique\ncondition. Narrowing your query up-front is more efficient.</p>\n</section>\n<section id=\"retrieve-related-objects-efficiently\">\n<h2>Retrieve related objects efficiently<a class=\"heading-anchor\" href=\"#retrieve-related-objects-efficiently\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Generally, accessing the database multiple times to retrieve different parts\nof a single ”set” of data is less efficient than retrieving it all in one\nquery. This is particularly important if you have a query that is executed in a\nloop, and could therefore end up doing many database queries, when only one\nis needed. Below are some techniques to combine queries for efficiency.</p>\n<section id=\"use-the-fetch-peers-fetch-mode\">\n<h3>Use the <code class=\"docutils literal notranslate\"><span class=\"pre\">FETCH_PEERS</span></code> fetch mode<a class=\"heading-anchor\" href=\"#use-the-fetch-peers-fetch-mode\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Use the <a class=\"reference internal\" href=\"/sv/6.1/topics/db/fetch-modes/#django.db.models.FETCH_PEERS\" title=\"django.db.models.FETCH_PEERS\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">FETCH_PEERS</span></code></a> fetch mode to make on-demand\nfield access more efficient with bulk-fetching. Enable it for all usage of\nyour models <a class=\"reference internal\" href=\"/sv/6.1/topics/db/fetch-modes/#fetch-modes-custom-manager\"><span class=\"std std-ref\">with a custom manager</span></a>.</p>\n<p>Using this fetch mode is easier than declaring fields to fetch with\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> or\n<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\"><span class=\"pre\">prefetch_related()</span></code></a>, especially when it’s\nhard to predict which fields will be accessed.</p>\n</section>\n<section id=\"use-queryset-select-related-and-prefetch-related\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_related()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-select-related-and-prefetch-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When the <a class=\"reference internal\" href=\"/sv/6.1/topics/db/fetch-modes/#django.db.models.FETCH_PEERS\" title=\"django.db.models.FETCH_PEERS\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">FETCH_PEERS</span></code></a> fetch mode is not appropriate or\nefficient enough, use <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a>\nand <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\"><span class=\"pre\">prefetch_related()</span></code></a>. Understand their\ndocumentation thoroughly and apply them where needed.</p>\n<p>It may be useful to apply these methods in <a class=\"reference internal\" href=\"/sv/6.1/topics/db/managers/\"><span class=\"doc\">managers and default managers</span></a>. Be aware when your manager is and is not used; for\nexample, related object access <a class=\"reference internal\" href=\"/sv/6.1/topics/db/managers/#managers-for-related-objects\"><span class=\"std std-ref\">uses the base manager</span></a> rather than the default manager.</p>\n</section>\n<section id=\"use-prefetch-related-objects\">\n<h3>Use <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code><a class=\"heading-anchor\" href=\"#use-prefetch-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Where <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-attr docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code></a> would be useful\nafter the queryset has been evaluated, use\n<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\"><span class=\"pre\">prefetch_related_objects()</span></code></a> to execute an extra\nprefetch.</p>\n</section>\n</section>\n<section id=\"don-t-retrieve-things-you-don-t-need\">\n<h2>Hämta inte saker som du inte behöver<a class=\"heading-anchor\" href=\"#don-t-retrieve-things-you-don-t-need\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"use-queryset-values-and-values-list\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.values()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-values-and-values-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When you only want a <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">list</span></code> of values, and don’t need ORM model\nobjects, make appropriate usage of\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>.\nThese can be useful for replacing model objects in template code - as long as\nthe dicts you supply have the same attributes as those used in the template,\nyou are fine.</p>\n</section>\n<section id=\"use-queryset-defer-and-only\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.defer()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-defer-and-only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Use <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\"><span class=\"pre\">defer()</span></code></a> and\n<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\"><span class=\"pre\">only()</span></code></a> if there are database columns\nyou know that you won’t need (or won’t need in most cases) to avoid loading\nthem. Note that if you <em>do</em> use them, the ORM will have to go and get them in\na separate query, making this a pessimization if you use it inappropriately.</p>\n<p>Var inte för aggressiv när det gäller att skjuta upp fält utan profilering eftersom databasen måste läsa det mesta av icke-text, icke-<code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code>-data från disken för en enda rad i resultaten, även om det slutar med att bara använda några få kolumner. Metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> är mest användbara när du kan undvika att ladda en massa textdata eller för fält som kan kräva mycket bearbetning för att konvertera tillbaka till Python. Som alltid, profilera först, optimera sedan.</p>\n</section>\n<section id=\"use-queryset-contains-obj\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.contains(obj)</span></code><a class=\"heading-anchor\" href=\"#use-queryset-contains-obj\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>…om du bara vill ta reda på om <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> finns i frågeuppsättningen, snarare än <code class=\"docutils literal notranslate\"><span class=\"pre\">om</span> <span class=\"pre\">obj</span> <span class=\"pre\">i</span> <span class=\"pre\">frågeuppsättningen</span></code>.</p>\n</section>\n<section id=\"use-queryset-count\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.count()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-count\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>…om du bara vill ha antalet, istället för att göra <code class=\"docutils literal notranslate\"><span class=\"pre\">len(queryset)</span></code>.</p>\n</section>\n<section id=\"use-queryset-exists\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.exists()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>…om du bara vill ta reda på om minst ett resultat finns, snarare än <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">queryset</span></code>.</p>\n<p>Men..:</p>\n</section>\n<section id=\"don-t-overuse-contains-count-and-exists\">\n<span id=\"overuse-of-count-and-exists\"></span><h3>Överanvänd inte <code class=\"docutils literal notranslate\"><span class=\"pre\">contains()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">exists()</span></code><a class=\"heading-anchor\" href=\"#don-t-overuse-contains-count-and-exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du kommer att behöva andra data från QuerySet ska du utvärdera dem omedelbart.</p>\n<p>Om vi till exempel antar att en <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code>-modell har en många-till-många-relation till <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>, är följande kod optimal:</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\">members</span> <span class=\"o\">=</span> <span class=\"n\">group</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"k\">if</span> <span class=\"n\">display_group_members</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">members</span><span class=\"p\">:</span>\n        <span class=\"k\">if</span> <span class=\"n\">current_user</span> <span class=\"ow\">in</span> <span class=\"n\">members</span><span class=\"p\">:</span>\n            <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;You and&quot;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">members</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;other users are members of this group.&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There are&quot;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">members</span><span class=\"p\">),</span> <span class=\"s2\">&quot;members in this group.&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">for</span> <span class=\"n\">member</span> <span class=\"ow\">in</span> <span class=\"n\">members</span><span class=\"p\">:</span>\n            <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">member</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There are no members in this group.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Det är optimalt eftersom:</p>\n<ol class=\"arabic simple\">\n<li><p>Eftersom QuerySets är lata görs inga databasfrågor om <code class=\"docutils literal notranslate\"><span class=\"pre\">display_group_members</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p></li>\n<li><p>Genom att lagra <code class=\"docutils literal notranslate\"><span class=\"pre\">group.members.all()</span></code> i variabeln <code class=\"docutils literal notranslate\"><span class=\"pre\">members</span></code> kan dess resultatcache återanvändas.</p></li>\n<li><p>Raden <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">members:</span></code> gör att <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.__bool__()</span></code> anropas, vilket gör att <code class=\"docutils literal notranslate\"><span class=\"pre\">group.members.all()</span></code>-frågan körs på databasen. Om det inte finns några resultat returneras <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, annars <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p>Raden <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">current_user</span> <span class=\"pre\">in</span> <span class=\"pre\">members:</span></code> kontrollerar om användaren finns i resultatcachen, så att inga ytterligare databasfrågor ställs.</p></li>\n<li><p>Användningen av <code class=\"docutils literal notranslate\"><span class=\"pre\">len(members)</span></code> anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.__len__()</span></code> och återanvänder resultatcachen, så inte heller här ställs några databasfrågor.</p></li>\n<li><p>Slingan <code class=\"docutils literal notranslate\"><span class=\"pre\">for</span> <span class=\"pre\">member</span></code> itererar över resultatcachen.</p></li>\n</ol>\n<p>Totalt gör denna kod antingen en eller noll databasförfrågningar. Den enda avsiktliga optimering som gjorts är att använda variabeln <code class=\"docutils literal notranslate\"><span class=\"pre\">members</span></code>. Att använda <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.exists()</span></code> för <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.contains()</span></code> för <code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.count()</span></code> för count skulle var och en orsaka ytterligare frågor.</p>\n</section>\n<section id=\"use-queryset-update-and-delete\">\n<h3>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-update-and-delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I stället för att hämta en mängd objekt, ställa in några värden och spara dem individuellt, använd en bulk SQL UPDATE-sats via <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">QuerySet.update()</span></a>. Gör på samma sätt <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">bulk deletes</span></a> när det är möjligt.</p>\n<p>Observera dock att dessa metoder för massuppdatering inte kan anropa metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> för enskilda instanser, vilket innebär att eventuella anpassade beteenden som du har lagt till för dessa metoder inte kommer att utföras, inklusive allt som drivs från det normala databasobjektet <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/\"><span class=\"doc\">signals</span></a>.</p>\n</section>\n<section id=\"use-foreign-key-values-directly\">\n<h3>Använd värden för främmande nycklar direkt<a class=\"heading-anchor\" href=\"#use-foreign-key-values-directly\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du bara behöver ett främmande nyckelvärde, använd det främmande nyckelvärde som redan finns på det objekt du har, i stället för att hämta hela det relaterade objektet och ta dess primära nyckel. dvs. gör:</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\">entry</span><span class=\"o\">.</span><span class=\"n\">blog_id</span>\n</code></pre></div>\n<p>istället för:</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\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span><span class=\"o\">.</span><span class=\"n\">id</span>\n</code></pre></div>\n</section>\n<section id=\"don-t-order-results-if-you-don-t-care\">\n<h3>Beställ inte resultat om du inte bryr dig<a class=\"heading-anchor\" href=\"#don-t-order-results-if-you-don-t-care\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ordering is not free; each field to order by is an operation the database must\nperform. If a model has a default ordering (<a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.ordering</span></code></a>) and you don’t need it, remove\nit on a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> by calling\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> with no parameters.</p>\n<p>Om du lägger till ett index i din databas kan det bidra till att förbättra beställningsresultatet.</p>\n</section>\n</section>\n<section id=\"use-bulk-methods\">\n<h2>Använd bulkmetoder<a class=\"heading-anchor\" href=\"#use-bulk-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Använd bulkmetoder för att minska antalet SQL-satser.</p>\n<section id=\"create-in-bulk\">\n<h3>Skapa i bulk<a class=\"heading-anchor\" href=\"#create-in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When creating objects, where possible, use the\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code></a> method to reduce the\nnumber of SQL queries. For example:</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is only a test&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is only a test&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note that <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code></a> has several\ncaveats, so ensure it’s appropriate for your use case.</p>\n</section>\n<section id=\"update-in-bulk\">\n<h3>Uppdatering i bulk<a class=\"heading-anchor\" href=\"#update-in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When updating objects, where possible, use the\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_update\" title=\"django.db.models.query.QuerySet.bulk_update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_update()</span></code></a> method to reduce the\nnumber of SQL queries. Given a list or queryset of objects:</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\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is only a test&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Följande exempel:</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\">entries</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is not a test&quot;</span>\n<span class=\"n\">entries</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is no longer a test&quot;</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_update</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">entries</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is not a test&quot;</span>\n<span class=\"n\">entries</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"n\">entries</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is no longer a test&quot;</span>\n<span class=\"n\">entries</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Note that <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_update\" title=\"django.db.models.query.QuerySet.bulk_update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_update()</span></code></a> has several\ncaveats, so ensure it’s appropriate for your use case.</p>\n</section>\n<section id=\"insert-in-bulk\">\n<h3>Insättning i bulk<a class=\"heading-anchor\" href=\"#insert-in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du infogar objekt i <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyFields</span></code></a>, använd <a class=\"reference internal\" href=\"/sv/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.add\" title=\"django.db.models.fields.related.RelatedManager.add\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add()</span></code></a> med flera objekt för att minska antalet SQL-frågor. Till exempel:</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\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">,</span> <span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">)</span>\n<span class=\"n\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…där <code class=\"docutils literal notranslate\"><span class=\"pre\">Band</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Artist</span></code> är modeller med ett många-till-många-förhållande.</p>\n<p>When inserting different pairs of objects into\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> or when the custom\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">through</span></code></a> table is defined, use\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code></a> method to reduce the\nnumber of SQL queries. For example:</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\">PizzaToppingRelationship</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">through</span>\n<span class=\"n\">PizzaToppingRelationship</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">PizzaToppingRelationship</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">my_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">pepperoni</span><span class=\"p\">),</span>\n        <span class=\"n\">PizzaToppingRelationship</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">your_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">pepperoni</span><span class=\"p\">),</span>\n        <span class=\"n\">PizzaToppingRelationship</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">your_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">mushroom</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"n\">ignore_conflicts</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">my_pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">pepperoni</span><span class=\"p\">)</span>\n<span class=\"n\">your_pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">pepperoni</span><span class=\"p\">,</span> <span class=\"n\">mushroom</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…där <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> har en många-till-många-relation. Observera att det finns ett antal <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">avrådan</span> <span class=\"pre\">för</span> <span class=\"pre\">denna</span> <span class=\"pre\">metod</span></code></a>, så se till att den är lämplig för ditt användningsfall.</p>\n</section>\n<section id=\"remove-in-bulk\">\n<h3>Ta bort i bulk<a class=\"heading-anchor\" href=\"#remove-in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du tar bort objekt från <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyFields</span></code></a>, använd <a class=\"reference internal\" href=\"/sv/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove\" title=\"django.db.models.fields.related.RelatedManager.remove\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove()</span></code></a> med flera objekt för att minska antalet SQL-frågor. Till exempel:</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\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">,</span> <span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">)</span>\n<span class=\"n\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…där <code class=\"docutils literal notranslate\"><span class=\"pre\">Band</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Artist</span></code> är modeller med ett många-till-många-förhållande.</p>\n<p>When removing multiple many-to-many relationships involving several instances\nof the related models, use the <a class=\"reference internal\" href=\"/sv/6.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\">delete()</span></code></a>\nmethod on a filtered queryset of the field’s\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">through</span></code></a> model. By combining multiple\nconditions with <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#q-objects\"><span class=\"std std-ref\">objekt av typen Q()</span></a>, you can delete several relationships in a\nsingle query. For example:</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.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n\n<span class=\"n\">PizzaToppingRelationship</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">through</span>\n<span class=\"n\">PizzaToppingRelationship</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n    <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">my_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">pepperoni</span><span class=\"p\">)</span>\n    <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">your_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">pepperoni</span><span class=\"p\">)</span>\n    <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">=</span><span class=\"n\">your_pizza</span><span class=\"p\">,</span> <span class=\"n\">topping</span><span class=\"o\">=</span><span class=\"n\">mushroom</span><span class=\"p\">)</span>\n<span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>…är att föredra framför:</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\">my_pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">pepperoni</span><span class=\"p\">)</span>\n<span class=\"n\">your_pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">pepperoni</span><span class=\"p\">,</span> <span class=\"n\">mushroom</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…där <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> har ett många-till-många-förhållande.</p>\n</section>\n</section>","rootId":"database-access-optimization","toc":[{"title":"Profil först","anchor":"profile-first","children":[]},{"title":"Använda standardtekniker för DB-optimering","anchor":"use-standard-db-optimization-techniques","children":[]},{"title":"Förstå QuerySet","anchor":"understand-querysets","children":[{"title":"Förstå utvärdering av QuerySet","anchor":"understand-queryset-evaluation","children":[]},{"title":"Förstå cachelagrade attribut","anchor":"understand-cached-attributes","children":[]},{"title":"Använd malltaggen with","anchor":"use-the-with-template-tag","children":[]},{"title":"Använd iterator()","anchor":"use-iterator","children":[]},{"title":"Använd explain()","anchor":"use-explain","children":[]}]},{"title":"Gör databasarbete i databasen snarare än i Python","anchor":"do-database-work-in-the-database-rather-than-in-python","children":[{"title":"Använd RawSQL","anchor":"use-rawsql","children":[]},{"title":"Använd rå SQL","anchor":"use-raw-sql","children":[]}]},{"title":"Hämta enskilda objekt med hjälp av en unik, indexerad kolumn","anchor":"retrieve-individual-objects-using-a-unique-indexed-column","children":[]},{"title":"Retrieve related objects efficiently","anchor":"retrieve-related-objects-efficiently","children":[{"title":"Use the FETCH_PEERS fetch mode","anchor":"use-the-fetch-peers-fetch-mode","children":[]},{"title":"Använd QuerySet.select_related() och prefetch_related()","anchor":"use-queryset-select-related-and-prefetch-related","children":[]},{"title":"Use prefetch_related_objects()","anchor":"use-prefetch-related-objects","children":[]}]},{"title":"Hämta inte saker som du inte behöver","anchor":"don-t-retrieve-things-you-don-t-need","children":[{"title":"Använd QuerySet.values() och values_list()","anchor":"use-queryset-values-and-values-list","children":[]},{"title":"Använd QuerySet.defer() och only()","anchor":"use-queryset-defer-and-only","children":[]},{"title":"Använd QuerySet.contains(obj)","anchor":"use-queryset-contains-obj","children":[]},{"title":"Använd QuerySet.count()","anchor":"use-queryset-count","children":[]},{"title":"Använd QuerySet.exists()","anchor":"use-queryset-exists","children":[]},{"title":"Överanvänd inte contains(), count() och exists()","anchor":"don-t-overuse-contains-count-and-exists","children":[]},{"title":"Använd QuerySet.update() och delete()","anchor":"use-queryset-update-and-delete","children":[]},{"title":"Använd värden för främmande nycklar direkt","anchor":"use-foreign-key-values-directly","children":[]},{"title":"Beställ inte resultat om du inte bryr dig","anchor":"don-t-order-results-if-you-don-t-care","children":[]}]},{"title":"Använd bulkmetoder","anchor":"use-bulk-methods","children":[{"title":"Skapa i bulk","anchor":"create-in-bulk","children":[]},{"title":"Uppdatering i bulk","anchor":"update-in-bulk","children":[]},{"title":"Insättning i bulk","anchor":"insert-in-bulk","children":[]},{"title":"Ta bort i bulk","anchor":"remove-in-bulk","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/tablespaces","title":"Bordsytor","url":"/sv/6.1/topics/db/tablespaces/"},"next":{"docname":"topics/db/instrumentation","title":"Instrumentering av databaser","url":"/sv/6.1/topics/db/instrumentation/"},"formats":{"html":"/sv/6.1/topics/db/optimization/","markdown":"/sv/6.1/topics/db/optimization.md","json":"/sv/6.1/topics/db/optimization.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/optimization.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/db/optimization/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}