{"title":"Ansvariga","version":"6.1","locale":"sv","docname":"topics/db/managers","url":"/sv/6.1/topics/db/managers/","canonical":"https://djangodocs.dev/sv/6.1/topics/db/managers/","summary":"class Manager Link to this definition # En Manager är det gränssnitt genom vilket databasfrågeoperationer tillhandahålls till Django-modeller. Det finns minst en…","html":"<h1>Ansvariga<a class=\"heading-anchor\" href=\"#managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Manager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>En <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> är det gränssnitt genom vilket databasfrågeoperationer tillhandahålls till Django-modeller. Det finns minst en <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> för varje modell i en Django-applikation.</p>\n<p>Hur klasserna <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> fungerar finns dokumenterat i <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/\"><span class=\"doc\">Göra förfrågningar</span></a>; detta dokument tar specifikt upp modellalternativ som anpassar <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> beteende.</p>\n<section id=\"manager-names\">\n<span id=\"id1\"></span><h2>Namn på chefer<a class=\"heading-anchor\" href=\"#manager-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Som standard lägger Django till en <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> till varje Django modellklass. Men om du vill använda <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> som fältnamn, eller om du vill använda ett annat namn än <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> för <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, kan du byta namn på den per modell. Om du vill byta namn på <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> för en viss klass definierar du ett klassattribut av typen <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Manager()</span></code> för den modellen. 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Med hjälp av denna exempelmodell kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects</span></code> att generera ett <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code> undantag, men <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> kommer att ge en lista över alla <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objekt.</p>\n</section>\n<section id=\"custom-managers\">\n<span id=\"id2\"></span><h2>Anpassade chefer<a class=\"heading-anchor\" href=\"#custom-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Du kan använda en anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> i en viss modell genom att utöka basklassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> och instansiera din anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> i din modell.</p>\n<p>Det finns två anledningar till att du vill anpassa en <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>: att lägga till extra <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-metoder och/eller att ändra den första <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> som <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> returnerar.</p>\n<section id=\"adding-extra-manager-methods\">\n<h3>Lägga till extra förvaltningsmetoder<a class=\"heading-anchor\" href=\"#adding-extra-manager-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Att lägga till extra <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-metoder är det bästa sättet att lägga till funktionalitet på ”tabellnivå” i dina modeller. (För funktioner på ”radnivå”, dvs. funktioner som verkar på en enda instans av ett modellobjekt, ska du använda <a class=\"reference internal\" href=\"/sv/6.1/topics/db/models/#model-methods\"><span class=\"std std-ref\">Model methods</span></a>, inte anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-metoder)</p>\n<p>Till exempel lägger den här anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> till en metod <code class=\"docutils literal notranslate\"><span class=\"pre\">with_counts()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Coalesce</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">with_counts</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_responses</span><span class=\"o\">=</span><span class=\"n\">Coalesce</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;response&quot;</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OpinionPoll</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PollManager</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Response</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">poll</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">OpinionPoll</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>I det här exemplet skulle du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll.objects.with_counts()</span></code> för att få en <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> av <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll</span></code>-objekt med det extra attributet <code class=\"docutils literal notranslate\"><span class=\"pre\">num_responses</span></code>.</p>\n<p>En anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-metod kan returnera vad du vill. Den behöver inte returnera en <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>En annan sak att notera är att <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-metoder kan komma åt <code class=\"docutils literal notranslate\"><span class=\"pre\">self.model</span></code> för att hämta den modellklass som de är kopplade till.</p>\n</section>\n<section id=\"modifying-a-manager-s-initial-queryset\">\n<h3>Ändra en chefs initiala <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#modifying-a-manager-s-initial-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>En <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>’s bas <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> returnerar alla objekt i systemet. Till exempel, med hjälp av denna modell:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…kommer uttalandet <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> att returnera alla böcker i databasen.</p>\n<p>Du kan åsidosätta en <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>’s bas <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> genom att åsidosätta metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.get_queryset()</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> bör returnera en <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> med de egenskaper du behöver.</p>\n<p>Till exempel har följande modell <em>två</em> <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> - en som returnerar alla objekt och en som bara returnerar böckerna av Roald Dahl:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># First, define the Manager subclass.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DahlBookManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s2\">&quot;Roald Dahl&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># Then hook it into the Book model explicitly.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>  <span class=\"c1\"># The default manager.</span>\n    <span class=\"n\">dahl_objects</span> <span class=\"o\">=</span> <span class=\"n\">DahlBookManager</span><span class=\"p\">()</span>  <span class=\"c1\"># The Dahl-specific manager.</span>\n</code></pre></div>\n<p>Med den här exempelmodellen kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> att returnera alla böcker i databasen, men <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.dahl_objects.all()</span></code> kommer bara att returnera de som är skrivna av Roald Dahl.</p>\n<p>Eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> returnerar ett <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>-objekt kan du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> och alla andra <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>-metoder på det. Så dessa uttalanden är alla lagliga:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Matilda&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Detta exempel visade också på en annan intressant teknik: att använda flera managers på samma modell. Du kan koppla så många <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager()</span></code>-instanser till en modell som du vill. Detta är ett icke-repetitivt sätt att definiera gemensamma ”filter” för dina modeller.</p>\n<p>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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EditorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;E&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;E&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">AuthorManager</span><span class=\"p\">()</span>\n    <span class=\"n\">editors</span> <span class=\"o\">=</span> <span class=\"n\">EditorManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>I det här exemplet kan du begära <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.authors.all()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.editors.all()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code>, vilket ger förutsägbara resultat.</p>\n</section>\n<section id=\"default-managers\">\n<span id=\"id3\"></span><h3>Förvaltare som standard<a class=\"heading-anchor\" href=\"#default-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._default_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_default_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._default_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du använder anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-objekt, notera att den första <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> som Django stöter på (i den ordning de definieras i modellen) har en speciell status. Django tolkar den första <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> som definieras i en klass som ”standard” <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, och flera delar av Django (inklusive <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a>) kommer att använda den <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> exklusivt för den modellen. Som ett resultat är det en bra idé att vara försiktig i ditt val av standardhanterare för att undvika en situation där åsidosättande av <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> resulterar i en oförmåga att hämta objekt som du vill arbeta med.</p>\n<p>Du kan ange en anpassad standardhanterare med <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span> <span class=\"pre\">&lt;django.db.models.Options.default_manager_name&gt;`</span></code>.</p>\n<p>Om du skriver kod som måste hantera en okänd modell, t.ex. i en tredjepartsapp som implementerar en generisk vy, ska du använda den här hanteraren (eller <a class=\"reference internal\" href=\"#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a>) i stället för att anta att modellen har en <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>-hanterare.</p>\n</section>\n<section id=\"base-managers\">\n<h3>Baschefer<a class=\"heading-anchor\" href=\"#base-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._base_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_base_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._base_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<section id=\"using-managers-for-related-object-access\">\n<span id=\"managers-for-related-objects\"></span><h4>Använda chefer för åtkomst till relaterade objekt<a class=\"heading-anchor\" href=\"#using-managers-for-related-object-access\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Som standard använder Django en instans av managerklassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Model._base_manager</span></code> vid åtkomst till relaterade objekt (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">choice.question</span></code>), inte <code class=\"docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code> på det relaterade objektet. Detta beror på att Django måste kunna hämta det relaterade objektet, även om det annars skulle filtreras bort (och därmed vara otillgängligt) av standardhanteraren.</p>\n<p>Om den normala bashanterarklassen (<a class=\"reference internal\" href=\"#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Manager</span></code></a>) inte är lämplig för dina omständigheter kan du berätta för Django vilken klass som ska användas genom att ställa in <a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.base_manager_name\" title=\"django.db.models.Options.base_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.base_manager_name</span></code></a>.</p>\n<p>Bashanterare används inte vid frågor om relaterade modeller, eller när <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">åtkomst till en en-till-man eller många-till-man relation</span></a>. Om till exempel modellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> :ref:` från handledningen &lt;creating-models&gt;` hade ett fält <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted</span></code> och en bashanterare som filtrerar bort instanser med <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted=True</span></code>, skulle en frågeuppsättning som <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice.objects.filter(question__name__startswith='What')</span></code> inkludera val som är relaterade till borttagna frågor.</p>\n</section>\n<section id=\"don-t-filter-away-any-results-in-this-type-of-manager-subclass\">\n<h4>Filtrera inte bort några resultat i den här typen av manager-underklass<a class=\"heading-anchor\" href=\"#don-t-filter-away-any-results-in-this-type-of-manager-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Denna manager används för att komma åt objekt som är relaterade till från någon annan modell. I dessa situationer måste Django kunna se alla objekt för den modell som hämtas, så att <em>allt</em> som hänvisas till kan hämtas.</p>\n<p>Därför bör du inte åsidosätta <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> för att filtrera bort några rader. Om du gör det kommer Django att returnera ofullständiga resultat.</p>\n</section>\n</section>\n<section id=\"calling-custom-queryset-methods-from-the-manager\">\n<span id=\"calling-custom-queryset-methods-from-manager\"></span><h3>Anropa anpassade metoder för <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> från hanteraren<a class=\"heading-anchor\" href=\"#calling-custom-queryset-methods-from-the-manager\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Medan de flesta metoder från standard <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> är tillgängliga direkt från <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, är detta endast fallet för de extra metoder som definieras på en anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> om du också implementerar dem på <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;E&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">using</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">editors</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;E&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>I det här exemplet kan du anropa både <code class=\"docutils literal notranslate\"><span class=\"pre\">authors()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">editors()</span></code> direkt från hanteraren <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people</span></code>.</p>\n</section>\n<section id=\"creating-a-manager-with-queryset-methods\">\n<span id=\"create-manager-with-queryset-methods\"></span><h3>Skapa en manager med <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>-metoder<a class=\"heading-anchor\" href=\"#creating-a-manager-with-queryset-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I stället för ovanstående tillvägagångssätt som kräver duplicering av metoder på både <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> kan användas för att skapa en instans av <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> med en kopia av en anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>’s metoder:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonQuerySet</span><span class=\"o\">.</span><span class=\"n\">as_manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Instansen <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> som skapas av <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> kommer att vara praktiskt taget identisk med <code class=\"docutils literal notranslate\"><span class=\"pre\">PersonManager</span></code> från föregående exempel.</p>\n<p>Inte alla <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> -metoder är meningsfulla på <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> -nivån; till exempel förhindrar vi avsiktligt <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\">QuerySet.delete()</span></code></a> -metoden från att kopieras till <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> -klassen.</p>\n<p>Metoderna kopieras enligt följande regler:</p>\n<ul class=\"simple\">\n<li><p>Publika metoder kopieras som standard.</p></li>\n<li><p>Privata metoder (som börjar med en understrykning) kopieras inte som standard.</p></li>\n<li><p>Metoder med attributet <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> inställt på <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> kopieras alltid.</p></li>\n<li><p>Metoder med attributet <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> inställt på <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kopieras aldrig.</p></li>\n</ul>\n<p>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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">opted_out_public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"n\">opted_out_public_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_opted_in_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"n\">_opted_in_private_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<section id=\"from-queryset\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">from_queryset()</span></code><a class=\"heading-anchor\" href=\"#from-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.from_queryset\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">from_queryset</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">queryset_class</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.from_queryset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>För avancerad användning kanske du vill ha både en anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> och en anpassad <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Du kan göra det genom att anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.from_queryset()</span></code> som returnerar en <em>subklass</em> av din bas <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> med en kopia av de anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> metoderna:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_only_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_and_queryset_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)()</span>\n</code></pre></div>\n<p>Du kan också lagra den genererade klassen i en variabel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MyManager</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"custom-managers-and-model-inheritance\">\n<span id=\"custom-managers-and-inheritance\"></span><h3>Anpassade förvaltare och modellarv<a class=\"heading-anchor\" href=\"#custom-managers-and-model-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Så här hanterar Django egna managers och <a class=\"reference internal\" href=\"/sv/6.1/topics/db/models/#model-inheritance\"><span class=\"std std-ref\">modellarv</span></a>:</p>\n<ol class=\"arabic simple\">\n<li><p>Hanterare från basklasser ärvs alltid av underklassen, med Pythons normala namnupplösningsordning (namn på underklassen åsidosätter alla andra; sedan kommer namn på den första föräldraklassen, och så vidare).</p></li>\n<li><p>Om inga managers deklareras på en modell och/eller dess föräldrar skapar Django automatiskt manager <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>.</p></li>\n<li><p>Standardhanteraren för en klass är antingen den som valts med <a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.default_manager_name\" title=\"django.db.models.Options.default_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span></code></a>, eller den första hanteraren som deklarerats på modellen, eller standardhanteraren för den första överordnade modellen.</p></li>\n</ol>\n<p>Dessa regler ger den flexibilitet som krävs om du vill installera en samling anpassade hanterare på en grupp modeller, via en abstrakt basklass, men ändå anpassa standardhanteraren. Anta till exempel att du har den här basklassen:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AbstractBase</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>Om du använder detta direkt i en underordnad klass kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> att vara standardhanteraren om du inte deklarerar några hanterare i den underordnade klassen:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildA</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># This class has CustomManager as the default manager.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Om du vill ärva från <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>, men tillhandahålla en annan standardhanterare, kan du ange standardhanteraren på barnklassen:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildB</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># An explicit default manager.</span>\n    <span class=\"n\">default_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Här är <code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager</span></code> standard. Hanteraren <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> är fortfarande tillgänglig, eftersom den ärvs, men används inte som standard.</p>\n<p>Slutligen för det här exemplet, anta att du vill lägga till extra chefer i barnklassen, men fortfarande använda standard från <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>. Du kan inte lägga till den nya hanteraren direkt i barnklassen, eftersom det skulle åsidosätta standardvärdet och du måste också uttryckligen inkludera alla hanterare från den abstrakta basklassen. Lösningen är att lägga de extra förvaltarna i en annan basklass och införa den i arvshierarkin <em>efter</em> standardvärdena:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ExtraManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">extra_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildC</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">,</span> <span class=\"n\">ExtraManager</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># Default manager is CustomManager, but OtherManager is</span>\n    <span class=\"c1\"># also available via the &quot;extra_manager&quot; attribute.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Observera att även om du kan <em>definiera</em> en anpassad manager på den abstrakta modellen, kan du inte <em>invoke</em> några metoder som använder den abstrakta modellen. Det vill säga:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ClassA</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>är lagligt, men:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AbstractBase</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>kommer att ge upphov till ett undantag. Detta beror på att managers är avsedda att kapsla in logik för att hantera samlingar av objekt. Eftersom du inte kan ha en samling av abstrakta objekt är det inte meningsfullt att hantera dem. Om du har funktionalitet som gäller för den abstrakta modellen bör du lägga den funktionaliteten i en <code class=\"docutils literal notranslate\"><span class=\"pre\">staticmethod</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">classmethod</span></code> på den abstrakta modellen.</p>\n</section>\n<section id=\"implementation-concerns\">\n<h3>Problem med genomförandet<a class=\"heading-anchor\" href=\"#implementation-concerns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oavsett vilka funktioner du lägger till i din anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> måste det vara möjligt att göra en ytlig kopia av en <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-instans, dvs. följande kod måste fungera:</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">copy</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">manager</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">my_copy</span> <span class=\"o\">=</span> <span class=\"n\">copy</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">manager</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Django gör ytliga kopior av managerobjekt under vissa frågor; om din manager inte kan kopieras kommer dessa frågor att misslyckas.</p>\n<p>Detta kommer inte att vara ett problem för de flesta anpassade förvaltare. Om du bara lägger till enkla metoder till din <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> är det osannolikt att du oavsiktligt kommer att göra instanser av din <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> okopierbara. Men om du åsidosätter <code class=\"docutils literal notranslate\"><span class=\"pre\">__getattr__</span></code> eller någon annan privat metod i ditt <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>-objekt som kontrollerar objektets tillstånd, bör du se till att du inte påverkar möjligheten för din <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> att kopieras.</p>\n</section>\n</section>","rootId":"managers","toc":[{"title":"Namn på chefer","anchor":"manager-names","children":[]},{"title":"Anpassade chefer","anchor":"custom-managers","children":[{"title":"Lägga till extra förvaltningsmetoder","anchor":"adding-extra-manager-methods","children":[]},{"title":"Ändra en chefs initiala QuerySet","anchor":"modifying-a-manager-s-initial-queryset","children":[]},{"title":"Förvaltare som standard","anchor":"default-managers","children":[]},{"title":"Baschefer","anchor":"base-managers","children":[{"title":"Använda chefer för åtkomst till relaterade objekt","anchor":"using-managers-for-related-object-access","children":[]},{"title":"Filtrera inte bort några resultat i den här typen av manager-underklass","anchor":"don-t-filter-away-any-results-in-this-type-of-manager-subclass","children":[]}]},{"title":"Anropa anpassade metoder för QuerySet från hanteraren","anchor":"calling-custom-queryset-methods-from-the-manager","children":[]},{"title":"Skapa en manager med QuerySet-metoder","anchor":"creating-a-manager-with-queryset-methods","children":[{"title":"from_queryset()","anchor":"from-queryset","children":[]}]},{"title":"Anpassade förvaltare och modellarv","anchor":"custom-managers-and-model-inheritance","children":[]},{"title":"Problem med genomförandet","anchor":"implementation-concerns","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/search","title":"Sök","url":"/sv/6.1/topics/db/search/"},"next":{"docname":"topics/db/sql","title":"Utföra SQL-frågor i råformat","url":"/sv/6.1/topics/db/sql/"},"formats":{"html":"/sv/6.1/topics/db/managers/","markdown":"/sv/6.1/topics/db/managers.md","json":"/sv/6.1/topics/db/managers.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/managers.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/db/managers/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}