{"title":"Aggregering","version":"6.0","locale":"sv","docname":"topics/db/aggregation","url":"/sv/6.0/topics/db/aggregation/","canonical":"https://djangodocs.dev/sv/6.0/topics/db/aggregation/","summary":"I ämnesguiden om Djangos databasabstraktions-API beskrivs hur du kan använda Django-frågor som skapar, hämtar, uppdaterar och tar bort enskilda objekt.","html":"<h1>Aggregering<a class=\"heading-anchor\" href=\"#aggregation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>I ämnesguiden om <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/\"><span class=\"doc\">Djangos databasabstraktions-API</span></a> beskrivs hur du kan använda Django-frågor som skapar, hämtar, uppdaterar och tar bort enskilda objekt. Ibland behöver du dock hämta värden som härleds genom att sammanfatta eller <em>aggregera</em> en samling objekt. I den här ämnesguiden beskrivs hur aggregerade värden kan genereras och returneras med hjälp av Django-frågor.</p>\n<p>I den här guiden hänvisar vi till följande modeller. Dessa modeller används för att spåra lagret för en serie onlinebokhandlar:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    age <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Publisher</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">300</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">300</span><span class=\"p\">)</span>\n    pages <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    price <span class=\"o\">=</span> models<span class=\"o\">.</span>DecimalField<span class=\"p\">(</span>max_digits<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> decimal_places<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    rating <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n    authors <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n    publisher <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Publisher<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    pubdate <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Store</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">300</span><span class=\"p\">)</span>\n    books <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Book<span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"cheat-sheet\">\n<h2>Fuskark<a class=\"heading-anchor\" href=\"#cheat-sheet\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Har du bråttom? Så här gör du vanliga aggregerade frågor, förutsatt att modellerna ovan används:</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=\"go\"># Total number of books.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">2452</span>\n\n<span class=\"go\"># Total number of books with publisher=BaloneyPress</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>publisher__name<span class=\"o\">=</span><span class=\"s2\">&quot;BaloneyPress&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">73</span>\n\n<span class=\"go\"># Average price across all books, provide default to be returned instead</span>\n<span class=\"go\"># of None if no books exist.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;price__avg&#39;: 34.35}</span>\n\n<span class=\"go\"># Max price across all books, provide default to be returned instead of</span>\n<span class=\"go\"># None if no books exist.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Max\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;price__max&#39;: Decimal(&#39;81.20&#39;)}</span>\n\n<span class=\"go\"># Difference between the highest priced book and the average price of all books.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> FloatField\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    price_diff<span class=\"o\">=</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> output_field<span class=\"o\">=</span>FloatField<span class=\"p\">())</span> <span class=\"o\">-</span> Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;price_diff&#39;: 46.85}</span>\n\n<span class=\"go\"># All the following queries involve traversing the Book&lt;-&gt;Publisher</span>\n<span class=\"go\"># foreign key relationship backwards.</span>\n\n<span class=\"go\"># Each publisher, each with a count of books as a &quot;num_books&quot; attribute.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_books<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs\n<span class=\"go\">&lt;QuerySet [&lt;Publisher: BaloneyPress&gt;, &lt;Publisher: SalamiPress&gt;, ...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>num_books\n<span class=\"go\">73</span>\n\n<span class=\"go\"># Each publisher, with a separate count of books with a rating above and below 5</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Q\n<span class=\"gp\">&gt;&gt;&gt; </span>above_5 <span class=\"o\">=</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>book__rating__gt<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>below_5 <span class=\"o\">=</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>book__rating__lte<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>below_5<span class=\"o\">=</span>below_5<span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>above_5<span class=\"o\">=</span>above_5<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>above_5\n<span class=\"go\">23</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>below_5\n<span class=\"go\">12</span>\n\n<span class=\"go\"># The top 5 publishers, in order by number of books.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_books<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-num_books&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pubs<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>num_books\n<span class=\"go\">1323</span>\n</code></pre></div>\n</section>\n<section id=\"generating-aggregates-over-a-queryset\">\n<h2>Generera aggregat över en <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#generating-aggregates-over-a-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django erbjuder två sätt att generera aggregat. Det första sättet är att generera sammanfattningsvärden över en hel <code class=\"docutils literal notranslate\">QuerySet</code>. Säg till exempel att du vill beräkna genomsnittspriset för alla böcker som finns till försäljning. Djangos frågesyntax ger ett sätt att beskriva uppsättningen av alla böcker:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n</code></pre></div>\n<p>Vad vi behöver är ett sätt att beräkna sammanfattande värden över de objekt som tillhör detta <code class=\"docutils literal notranslate\">QuerySet</code>. Detta görs genom att lägga till en <code class=\"docutils literal notranslate\">aggregate()</code> klausul på <code class=\"docutils literal notranslate\">QuerySet</code>:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;price__avg&#39;: 34.35}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">all()</code> är överflödigt i detta exempel, så detta kan förenklas till:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;price__avg&#39;: 34.35}</span>\n</code></pre></div>\n<p>Argumentet till klausulen <code class=\"docutils literal notranslate\">aggregate()</code> beskriver det aggregerade värde som vi vill beräkna - i det här fallet genomsnittet av fältet <code class=\"docutils literal notranslate\">price</code> i modellen <code class=\"docutils literal notranslate\">Book</code>. En lista över de aggregatfunktioner som finns tillgängliga finns i <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">QuerySet reference</span></a>.</p>\n<p><code class=\"docutils literal notranslate\">aggregate()</code> är en terminalklausul för en <code class=\"docutils literal notranslate\">QuerySet</code> som, när den anropas, returnerar en ordbok med namn-värde-par. Namnet är en identifierare för aggregatvärdet; värdet är det beräknade aggregatet. Namnet genereras automatiskt från fältets namn och aggregatfunktionen. Om du manuellt vill ange ett namn för det aggregerade värdet kan du göra det genom att ange namnet när du anger aggregatklausulen:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>average_price<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;average_price&#39;: 34.35}</span>\n</code></pre></div>\n<p>Om du vill generera mer än ett aggregat lägger du till ytterligare ett argument i <code class=\"docutils literal notranslate\">aggregate()</code>-satsen. Så om vi också ville veta det högsta och lägsta priset för alla böcker skulle vi ställa frågan:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> Max<span class=\"p\">,</span> Min\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">),</span> Max<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">),</span> Min<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;price__avg&#39;: 34.35, &#39;price__max&#39;: Decimal(&#39;81.20&#39;), &#39;price__min&#39;: Decimal(&#39;12.99&#39;)}</span>\n</code></pre></div>\n</section>\n<section id=\"generating-aggregates-for-each-item-in-a-queryset\">\n<h2>Generera aggregat för varje objekt i en <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#generating-aggregates-for-each-item-in-a-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det andra sättet att generera sammanfattningsvärden är att generera en oberoende sammanfattning för varje objekt i en <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>. Om du t.ex. hämtar en lista med böcker kanske du vill veta hur många författare som har bidragit till varje bok. Varje bok har en många-till-många-relation med författaren; vi vill sammanfatta denna relation för varje bok i <code class=\"docutils literal notranslate\">QuerySet</code>.</p>\n<p>Sammanfattningar per objekt kan genereras med hjälp av klausulen <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\">annotate()</code></a>. När en <code class=\"docutils literal notranslate\">annotate()</code>-sats anges kommer varje objekt i <code class=\"docutils literal notranslate\">QuerySet</code> att annoteras med de angivna värdena.</p>\n<p>Syntaxen för dessa annoteringar är identisk med den som används för <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\">aggregate()</code></a>-klausulen. Varje argument till <code class=\"docutils literal notranslate\">annotate()</code> beskriver ett aggregat som ska beräknas. Till exempel, för att annotera böcker med antalet författare:</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=\"go\"># Build an annotated queryset</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># Interrogate the first object in the queryset</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&lt;Book: The Definitive Guide to Django&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>authors__count\n<span class=\"go\">2</span>\n<span class=\"go\"># Interrogate the second object in the queryset</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"go\">&lt;Book: Practical Django Projects&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span>authors__count\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>Precis som för <code class=\"docutils literal notranslate\">aggregate()</code> härleds namnet på annotationen automatiskt från namnet på aggregatfunktionen och namnet på det fält som ska aggregeras. Du kan åsidosätta detta standardnamn genom att ange ett alias när du specificerar annotationen:</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>q <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>num_authors\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span>num_authors\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>Till skillnad från <code class=\"docutils literal notranslate\">aggregate()</code> är <code class=\"docutils literal notranslate\">annotate()</code> <em>inte</em> en terminalsats. Resultatet av <code class=\"docutils literal notranslate\">annotate()</code>-satsen är en <code class=\"docutils literal notranslate\">QuerySet</code>; denna <code class=\"docutils literal notranslate\">QuerySet</code> kan modifieras med vilken annan <code class=\"docutils literal notranslate\">QuerySet</code>-operation som helst, inklusive <code class=\"docutils literal notranslate\">filter()</code>, <code class=\"docutils literal notranslate\">order_by()</code> eller till och med ytterligare anrop till <code class=\"docutils literal notranslate\">annotate()</code>.</p>\n<section id=\"combining-multiple-aggregations\">\n<span id=\"id1\"></span><h3>Kombinera flera aggregat<a class=\"heading-anchor\" href=\"#combining-multiple-aggregations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Att kombinera flera aggregeringar med <code class=\"docutils literal notranslate\">annotate()</code> kommer <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/10060\">att ge fel resultat</a> eftersom joins används istället för subqueries:</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>book <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>first<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>book<span class=\"o\">.</span>authors<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>book<span class=\"o\">.</span>store_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">3</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;store&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>authors__count\n<span class=\"go\">6</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>store__count\n<span class=\"go\">6</span>\n</code></pre></div>\n<p>För de flesta aggregat finns det inget sätt att undvika detta problem, men <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.Count\" title=\"django.db.models.Count\"><code class=\"xref py py-class docutils literal notranslate\">Count</code></a>-aggregatet har en <code class=\"docutils literal notranslate\">distinct</code>-parameter som kan hjälpa till:</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>q <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">,</span> distinct<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;store&quot;</span><span class=\"p\">,</span> distinct<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>authors__count\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>store__count\n<span class=\"go\">3</span>\n</code></pre></div>\n<aside class=\"admonition-if-in-doubt-inspect-the-sql-query admonition\" role=\"note\">\n<p class=\"admonition-title\">Om du är osäker, inspektera SQL-frågan!</p>\n<p>För att förstå vad som händer i din query kan du inspektera egenskapen <code class=\"docutils literal notranslate\">query</code> i din <code class=\"docutils literal notranslate\">QuerySet</code>.</p>\n</aside>\n</section>\n</section>\n<section id=\"joins-and-aggregates\">\n<h2>Sammanfogningar och aggregat<a class=\"heading-anchor\" href=\"#joins-and-aggregates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Hittills har vi behandlat aggregeringar över fält som tillhör den modell som efterfrågas. Ibland kommer dock det värde som du vill aggregera att tillhöra en modell som är relaterad till den modell som du frågar efter.</p>\n<p>När du anger fältet som ska aggregeras i en aggregatfunktion tillåter Django dig att använda samma <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">double underscore notation</span></a> som används när du hänvisar till relaterade fält i filter. Django kommer då att hantera eventuella tabelljoins som krävs för att hämta och aggregera det relaterade värdet.</p>\n<p>För att till exempel hitta prisintervallet för böcker som erbjuds i varje butik kan du använda annotationen:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Max<span class=\"p\">,</span> Min\n<span class=\"gp\">&gt;&gt;&gt; </span>Store<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>min_price<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">),</span> max_price<span class=\"o\">=</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Detta säger till Django att hämta <code class=\"docutils literal notranslate\">Store</code>-modellen, ansluta (genom många-till-många-relationen) till <code class=\"docutils literal notranslate\">Book</code>-modellen och aggregera på prisfältet i bokmodellen för att producera ett lägsta och högsta värde.</p>\n<p>Samma regler gäller för klausulen <code class=\"docutils literal notranslate\">aggregate()</code>. Om du vill veta det lägsta och högsta priset för en bok som finns till försäljning i någon av butikerna kan du använda aggregatet:</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>Store<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>min_price<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">),</span> max_price<span class=\"o\">=</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Join-kedjorna kan vara så djupa som du vill. Om du t.ex. vill få fram åldern på den yngsta författaren till en bok som finns till försäljning kan du ställa frågan:</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>Store<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>youngest_age<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;books__authors__age&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<section id=\"following-relationships-backwards\">\n<h3>Följa relationer baklänges<a class=\"heading-anchor\" href=\"#following-relationships-backwards\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>På ett sätt som liknar <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/#lookups-that-span-relationships\"><span class=\"std std-ref\">Uppslagningar som sträcker sig över relationer</span></a> kan aggregeringar och annoteringar av fält i modeller eller modeller som är relaterade till den modell du söker efter inkludera genomgång av ”omvända” relationer. Namnet med små bokstäver på relaterade modeller och dubbla understreck används även här.</p>\n<p>Vi kan till exempel be om alla förlag, annoterade med deras respektive totala boklagerräknare (notera hur vi använder <code class=\"docutils literal notranslate\">'book</code> för att ange <code class=\"docutils literal notranslate\">Publisher</code> -&gt; <code class=\"docutils literal notranslate\">Book</code> omvänd främmande nyckelhopp):</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> Count<span class=\"p\">,</span> Min<span class=\"p\">,</span> Sum\n<span class=\"gp\">&gt;&gt;&gt; </span>Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Varje <code class=\"docutils literal notranslate\">Publisher</code> i den resulterande <code class=\"docutils literal notranslate\">QuerySet</code> kommer att ha ett extra attribut som heter <code class=\"docutils literal notranslate\">book__count</code>)</p>\n<p>Vi kan också be om den äldsta boken av alla dessa som hanteras av varje förlag:</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>Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>oldest_pubdate<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;book__pubdate&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Den resulterande ordboken kommer att ha en nyckel som heter <code class=\"docutils literal notranslate\">'oldest_pubdate'</code>. Om inget sådant alias anges kommer det att vara det ganska långa <code class=\"docutils literal notranslate\">'book__pubdate__min'</code>)</p>\n<p>Detta gäller inte bara för främmande nycklar. Det fungerar också med många-till-många-relationer. Vi kan till exempel be om varje författare, annoterad med det totala antalet sidor med tanke på alla böcker som författaren har (med)skrivit (notera hur vi använder <code class=\"docutils literal notranslate\">'book'</code> för att specificera <code class=\"docutils literal notranslate\">Author</code> -&gt; <code class=\"docutils literal notranslate\">Book</code> omvänd många-till-många hopp):</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>total_pages<span class=\"o\">=</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;book__pages&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Varje <code class=\"docutils literal notranslate\">Author</code> i den resulterande <code class=\"docutils literal notranslate\">QuerySet</code> kommer att ha ett extra attribut som heter <code class=\"docutils literal notranslate\">total_pages</code>. Om inget sådant alias anges kommer det att vara det ganska långa <code class=\"docutils literal notranslate\">book__pages__sum</code>)</p>\n<p>Eller be om det genomsnittliga betyget för alla böcker skrivna av författare som vi har i arkivet:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>average_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Den resulterande ordboken kommer att ha en nyckel som heter <code class=\"docutils literal notranslate\">'average_rating'</code>. Om inget sådant alias anges kommer det att vara det ganska långa <code class=\"docutils literal notranslate\">'book__rating__avg'</code>)</p>\n</section>\n</section>\n<section id=\"aggregations-and-other-queryset-clauses\">\n<h2>Aggregeringar och andra <code class=\"docutils literal notranslate\">QuerySet</code>-klausuler<a class=\"heading-anchor\" href=\"#aggregations-and-other-queryset-clauses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"filter-and-exclude\">\n<h3><code class=\"docutils literal notranslate\">filter()</code> och <code class=\"docutils literal notranslate\">exkludera()</code><a class=\"heading-anchor\" href=\"#filter-and-exclude\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Aggregat kan också delta i filter. Alla <code class=\"docutils literal notranslate\">filter()</code> (eller <code class=\"docutils literal notranslate\">exclude()</code>) som tillämpas på normala modellfält kommer att begränsa de objekt som beaktas för aggregering.</p>\n<p>När ett filter används med en <code class=\"docutils literal notranslate\">annotate()</code>-sats begränsas de objekt för vilka en annotering beräknas. Du kan t.ex. generera en annoterad lista över alla böcker som har en titel som börjar med ”Django” med hjälp av frågan:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Django&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>När ett filter används med en <code class=\"docutils literal notranslate\">aggregate()</code>-sats begränsar det de objekt över vilka aggregatet beräknas. Du kan t.ex. generera genomsnittspriset för alla böcker med en titel som börjar med ”Django” med hjälp av frågan:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Django&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<section id=\"filtering-on-annotations\">\n<span id=\"id2\"></span><h4>Filtrering av anteckningar<a class=\"heading-anchor\" href=\"#filtering-on-annotations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Annoterade värden kan också filtreras. Aliaset för annoteringen kan användas i <code class=\"docutils literal notranslate\">filter()</code> och <code class=\"docutils literal notranslate\">exclude()</code>-klausuler på samma sätt som alla andra modellfält.</p>\n<p>Om du t.ex. vill skapa en lista över böcker som har mer än en författare kan du ställa frågan:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>num_authors__gt<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Den här frågan genererar en annoterad resultatuppsättning och genererar sedan ett filter baserat på annoteringen.</p>\n<p>Om du behöver två anteckningar med två separata filter kan du använda argumentet <code class=\"docutils literal notranslate\">filter</code> med valfritt aggregat. Till exempel, för att generera en lista över författare med ett antal högt rankade böcker:</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>highly_rated <span class=\"o\">=</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>book__rating__gte<span class=\"o\">=</span><span class=\"mi\">7</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_books<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">),</span> highly_rated_books<span class=\"o\">=</span>highly_rated<span class=\"p\">)</span>\n</code></pre></div>\n<p>Varje <code class=\"docutils literal notranslate\">Author</code> i resultatmängden kommer att ha attributen <code class=\"docutils literal notranslate\">num_books</code> och <code class=\"docutils literal notranslate\">highly_rated_books</code>. Se även <a class=\"reference internal\" href=\"/sv/6.0/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">Villkorlig aggregering</span></a>.</p>\n<aside class=\"admonition-choosing-between-filter-and-queryset-filter admonition\" role=\"note\">\n<p class=\"admonition-title\">Att välja mellan <code class=\"docutils literal notranslate\">filter</code> och <code class=\"docutils literal notranslate\">QuerySet.filter()</code></p>\n<p>Undvik att använda argumentet <code class=\"docutils literal notranslate\">filter</code> med en enda annotation eller aggregering. Det är mer effektivt att använda <code class=\"docutils literal notranslate\">QuerySet.filter()</code> för att utesluta rader. Argumentet <code class=\"docutils literal notranslate\">filter</code> för aggregering är endast användbart när du använder två eller flera aggregeringar över samma relationer med olika villkor.</p>\n</aside>\n</section>\n<section id=\"order-of-annotate-and-filter-clauses\">\n<h4>Ordningsföljd för <code class=\"docutils literal notranslate\">annotate()</code> och <code class=\"docutils literal notranslate\">filter()</code> klausuler<a class=\"heading-anchor\" href=\"#order-of-annotate-and-filter-clauses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>När du utvecklar en komplex fråga som innehåller både <code class=\"docutils literal notranslate\">annotate()</code>- och <code class=\"docutils literal notranslate\">filter()</code>-klausuler ska du vara särskilt uppmärksam på i vilken ordning klausulerna tillämpas på <code class=\"docutils literal notranslate\">QuerySet</code>.</p>\n<p>När en <code class=\"docutils literal notranslate\">annotate()</code>-klausul tillämpas på en fråga, beräknas annoteringen över frågans tillstånd fram till den punkt där annoteringen begärs. Den praktiska konsekvensen av detta är att <code class=\"docutils literal notranslate\">filter()</code> och <code class=\"docutils literal notranslate\">annotate()</code> inte är kommutativa operationer.</p>\n<p>Givetvis:</p>\n<ul class=\"simple\">\n<li><p>Förlag A har två böcker med betyg 4 och 5.</p></li>\n<li><p>Förlag B har två böcker med betyg 1 och 4.</p></li>\n<li><p>Förlag C har en bok med betyg 1.</p></li>\n</ul>\n<p>Här är ett exempel med aggregatet <code class=\"docutils literal notranslate\">Count</code>:</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>a<span class=\"p\">,</span> b <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_books<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> distinct<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    book__rating__gt<span class=\"o\">=</span><span class=\"mf\">3.0</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> a<span class=\"o\">.</span>num_books\n<span class=\"go\">(&lt;Publisher: A&gt;, 2)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"p\">,</span> b<span class=\"o\">.</span>num_books\n<span class=\"go\">(&lt;Publisher: B&gt;, 2)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> b <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>book__rating__gt<span class=\"o\">=</span><span class=\"mf\">3.0</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_books<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> a<span class=\"o\">.</span>num_books\n<span class=\"go\">(&lt;Publisher: A&gt;, 2)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"p\">,</span> b<span class=\"o\">.</span>num_books\n<span class=\"go\">(&lt;Publisher: B&gt;, 1)</span>\n</code></pre></div>\n<p>Båda frågorna returnerar en lista med förlag som har minst en bok med ett betyg som överstiger 3,0, vilket innebär att förlag C utesluts.</p>\n<p>I den första frågan föregår anteckningen filtret, så filtret har ingen effekt på anteckningen. <code class=\"docutils literal notranslate\">distinct=True</code> krävs för att undvika en <a class=\"reference internal\" href=\"#combining-multiple-aggregations\"><span class=\"std std-ref\">query bug</span></a>.</p>\n<p>Den andra frågan räknar antalet böcker som har ett betyg som överstiger 3,0 för varje utgivare. Filtret föregår anteckningen, så filtret begränsar de objekt som beaktas vid beräkningen av anteckningen.</p>\n<p>Här är ett annat exempel med aggregatet <code class=\"docutils literal notranslate\">Avg</code>:</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>a<span class=\"p\">,</span> b <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>avg_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    book__rating__gt<span class=\"o\">=</span><span class=\"mf\">3.0</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> a<span class=\"o\">.</span>avg_rating\n<span class=\"go\">(&lt;Publisher: A&gt;, 4.5)  # (5+4)/2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"p\">,</span> b<span class=\"o\">.</span>avg_rating\n<span class=\"go\">(&lt;Publisher: B&gt;, 2.5)  # (1+4)/2</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> b <span class=\"o\">=</span> Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>book__rating__gt<span class=\"o\">=</span><span class=\"mf\">3.0</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"p\">,</span> a<span class=\"o\">.</span>avg_rating\n<span class=\"go\">(&lt;Publisher: A&gt;, 4.5)  # (5+4)/2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"p\">,</span> b<span class=\"o\">.</span>avg_rating\n<span class=\"go\">(&lt;Publisher: B&gt;, 4.0)  # 4/1 (book with rating 1 excluded)</span>\n</code></pre></div>\n<p>Den första frågan gäller det genomsnittliga betyget för alla förlagets böcker för de förlag som har minst en bok med ett betyg som överstiger 3,0. I den andra frågan efterfrågas medelbetyget för ett förlags böcker för endast de betyg som överstiger 3,0.</p>\n<p>Det är svårt att förstå hur ORM kommer att översätta komplexa querysets till SQL-frågor, så om du är osäker, inspektera SQL med <code class=\"docutils literal notranslate\">str(queryset.query)</code> och skriv många tester.</p>\n</section>\n</section>\n<section id=\"order-by\">\n<h3><code class=\"docutils literal notranslate\">order_by()</code><a class=\"heading-anchor\" href=\"#order-by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Annoteringar kan användas som grund för beställning. När du definierar en <code class=\"docutils literal notranslate\">order_by()</code>-sats kan de aggregat du tillhandahåller referera till alla alias som definierats som en del av en <code class=\"docutils literal notranslate\">annotate()</code>-sats i frågan.</p>\n<p>Om du t.ex. vill beställa ett <code class=\"docutils literal notranslate\">QuerySet</code> med böcker efter antalet författare som har bidragit till boken kan du använda följande fråga:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;num_authors&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"values\">\n<h3><code class=\"docutils literal notranslate\">värden()</code><a class=\"heading-anchor\" href=\"#values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vanligtvis genereras annoteringar per objekt - en annoterad <code class=\"docutils literal notranslate\">QuerySet</code> returnerar ett resultat för varje objekt i den ursprungliga <code class=\"docutils literal notranslate\">QuerySet</code>. Men när en <code class=\"docutils literal notranslate\">values()</code>-klausul används för att begränsa de kolumner som returneras i resultatuppsättningen, är metoden för utvärdering av annoteringar något annorlunda. Istället för att returnera ett annoterat resultat för varje resultat i den ursprungliga <code class=\"docutils literal notranslate\">QuerySet</code>, grupperas de ursprungliga resultaten enligt de unika kombinationerna av de fält som anges i <code class=\"docutils literal notranslate\">values()</code>-klausulen. En annotering tillhandahålls sedan för varje unik grupp; annoteringen beräknas över alla medlemmar i gruppen.</p>\n<p>Ett exempel är en författarfråga som försöker ta reda på det genomsnittliga betyget för böcker skrivna av varje författare:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>average_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Detta kommer att ge ett resultat för varje författare i databasen, kommenterat med deras genomsnittliga bokbetyg.</p>\n<p>Resultatet blir dock något annorlunda om du använder en <code class=\"docutils literal notranslate\">values()</code>-sats:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>average_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>I det här exemplet kommer författarna att grupperas efter namn, så du får bara ett annoterat resultat för varje <em>unikt</em> författarnamn. Det innebär att om du har två författare med samma namn kommer deras resultat att slås samman till ett enda resultat i resultatet av frågan; genomsnittet beräknas som genomsnittet för de böcker som skrivits av båda författarna.</p>\n<section id=\"order-of-annotate-and-values-clauses\">\n<h4>Ordningsföljd för klausulerna <code class=\"docutils literal notranslate\">annotate()</code> och <code class=\"docutils literal notranslate\">values()</code><a class=\"heading-anchor\" href=\"#order-of-annotate-and-values-clauses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Precis som med <code class=\"docutils literal notranslate\">filter()</code>-klausulen har ordningen i vilken <code class=\"docutils literal notranslate\">annotate()</code> och <code class=\"docutils literal notranslate\">values()</code>-klausulerna tillämpas på en fråga betydelse. Om <code class=\"docutils literal notranslate\">values()</code>-satsen föregår <code class=\"docutils literal notranslate\">annotate()</code>, kommer annoteringen att beräknas med hjälp av den gruppering som beskrivs i <code class=\"docutils literal notranslate\">values()</code>-satsen.</p>\n<p>Men om klausulen <code class=\"docutils literal notranslate\">annotate()</code> föregår klausulen <code class=\"docutils literal notranslate\">values()</code> genereras annoteringarna över hela frågeuppsättningen. I detta fall begränsar klausulen <code class=\"docutils literal notranslate\">values()</code> endast de fält som genereras vid utmatningen.</p>\n<p>Om vi till exempel vänder på ordningen i klausulerna <code class=\"docutils literal notranslate\">values()</code> och <code class=\"docutils literal notranslate\">annotate()</code> från vårt tidigare exempel:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>average_rating<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;average_rating&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Detta kommer nu att ge ett unikt resultat för varje författare; dock kommer endast författarens namn och <code class=\"docutils literal notranslate\">average_rating</code>-annoteringen att returneras i utdata.</p>\n<p>Du bör också notera att <code class=\"docutils literal notranslate\">average_rating</code> uttryckligen har inkluderats i listan över värden som skall returneras. Detta är nödvändigt på grund av ordningsföljden i klausulerna <code class=\"docutils literal notranslate\">values()</code> och <code class=\"docutils literal notranslate\">annotate()</code>.</p>\n<p>Om klausulen <code class=\"docutils literal notranslate\">values()</code> föregår klausulen <code class=\"docutils literal notranslate\">annotate()</code> läggs eventuella anteckningar automatiskt till i resultatuppsättningen. Men om <code class=\"docutils literal notranslate\">values()</code>-satsen tillämpas efter <code class=\"docutils literal notranslate\">annotate()</code>-satsen måste du uttryckligen inkludera aggregatkolumnen.</p>\n</section>\n<section id=\"interaction-with-order-by\">\n<span id=\"aggregation-ordering-interaction\"></span><h4>Interaktion med <code class=\"docutils literal notranslate\">order_by()</code><a class=\"heading-anchor\" href=\"#interaction-with-order-by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Fält som nämns i <code class=\"docutils literal notranslate\">order_by()</code>-delen av en queryset används när utdata väljs, även om de inte annars anges i <code class=\"docutils literal notranslate\">values()</code>-anropet. Dessa extra fält används för att gruppera ”liknande” resultat tillsammans och de kan göra att annars identiska resultatrader ser ut att vara separata. Detta visar sig särskilt när man räknar saker.</p>\n<p>Som exempel kan vi anta att du har en modell som ser ut så hä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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Item</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n    data <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n</code></pre></div>\n<p>Om du vill räkna hur många gånger varje distinkt <code class=\"docutils literal notranslate\">data</code>-värde förekommer i en ordnad frågeuppsättning kan du prova så hä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>items <span class=\"o\">=</span> Item<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"c1\"># Warning: not quite correct!</span>\nitems<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>…som kommer att gruppera <code class=\"docutils literal notranslate\">Item</code>-objekten efter deras gemensamma <code class=\"docutils literal notranslate\">data</code>-värden och sedan räkna antalet <code class=\"docutils literal notranslate\">id</code>-värden i varje grupp. Förutom att det inte riktigt kommer att fungera. Ordningen efter <code class=\"docutils literal notranslate\">namn</code> kommer också att spela en roll i grupperingen, så den här frågan kommer att gruppera efter distinkta <code class=\"docutils literal notranslate\">(data, namn)</code> par, vilket inte är vad du vill. Istället bör du konstruera denna queryset:</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>items<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">()</span>\n</code></pre></div>\n<p>…och rensar bort all ordning i frågan. Du kan också beställa efter, säg, <code class=\"docutils literal notranslate\">data</code> utan några skadliga effekter, eftersom det redan spelar en roll i frågan.</p>\n<p>Detta beteende är detsamma som det som noteras i queryset-dokumentationen för <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a> och den allmänna regeln är densamma: normalt vill du inte att extra kolumner ska spela en roll i resultatet, så rensa bort ordningen, eller se åtminstone till att den är begränsad endast till de fält som du också väljer i ett <code class=\"docutils literal notranslate\">values()</code>-anrop.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>You might reasonably ask why Django doesn’t remove the extraneous columns\nfor you. The main reason is consistency with <code class=\"docutils literal notranslate\">distinct()</code> and other\nplaces: Django <strong>never</strong> removes ordering constraints that you have\nspecified <em>explicitly with</em> <code class=\"docutils literal notranslate\">order_by()</code> (and we can’t change those\nother methods’ behavior, as that would violate our\n<a class=\"reference internal\" href=\"/sv/6.0/misc/api-stability/\"><span class=\"doc\">API-stabilitet</span></a> policy).</p>\n</aside>\n<aside class=\"admonition-default-ordering-not-applied-to-group-by admonition\" role=\"note\">\n<p class=\"admonition-title\">Default ordering not applied to GROUP BY</p>\n<p><code class=\"docutils literal notranslate\">GROUP BY</code> queries (for example, those using <code class=\"docutils literal notranslate\">.values()</code> and\n<code class=\"docutils literal notranslate\">.annotate()</code>) don’t use the model’s default ordering.\nUse <code class=\"docutils literal notranslate\">order_by()</code> explicitly when a given order is needed.</p>\n</aside>\n</section>\n</section>\n<section id=\"aggregating-annotations\">\n<h3>Aggregering av anteckningar<a class=\"heading-anchor\" href=\"#aggregating-annotations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan också generera ett aggregat på resultatet av en annotation. När du definierar en <code class=\"docutils literal notranslate\">aggregate()</code>-sats kan de aggregat du tillhandahåller referera till alla alias som definierats som en del av en <code class=\"docutils literal notranslate\">annotate()</code>-sats i frågan.</p>\n<p>Om du t.ex. vill beräkna det genomsnittliga antalet författare per bok måste du först anteckna författarantalet i bokuppsättningen och sedan aggregera författarantalet med hänvisning till anteckningsfältet:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;num_authors&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;num_authors__avg&#39;: 1.66}</span>\n</code></pre></div>\n</section>\n<section id=\"aggregating-on-empty-querysets-or-groups\">\n<h3>Aggregering på tomma querysets eller grupper<a class=\"heading-anchor\" href=\"#aggregating-on-empty-querysets-or-groups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När en aggregering tillämpas på en tom frågeuppsättning eller gruppering, standardiseras resultatet till dess parameter <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a>, vanligtvis <code class=\"docutils literal notranslate\">None</code>. Detta beteende uppstår eftersom aggregeringsfunktioner returnerar <code class=\"docutils literal notranslate\">NULL</code> när den körda frågan inte returnerar några rader.</p>\n<p>Du kan ange ett returvärde genom att ange argumentet <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> för de flesta aggregeringar. Men eftersom <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.Count\" title=\"django.db.models.Count\"><code class=\"xref py py-class docutils literal notranslate\">Count</code></a> inte stöder argumentet <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a>, kommer den alltid att returnera <code class=\"docutils literal notranslate\">0</code> för tomma frågeuppsättningar eller grupper.</p>\n<p>Om man till exempel antar att ingen bok innehåller <em>web</em> i sitt namn, skulle beräkningen av det totala priset för denna bokuppsättning returnera <code class=\"docutils literal notranslate\">None</code> eftersom det inte finns några matchande rader att beräkna <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.Sum\" title=\"django.db.models.Sum\"><code class=\"xref py py-class docutils literal notranslate\">Sum</code></a>-aggregeringen på:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Sum\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&quot;price__sum&quot;: None}</span>\n</code></pre></div>\n<p>Argumentet <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> kan dock ställas in när man anropar <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.Sum\" title=\"django.db.models.Sum\"><code class=\"xref py py-class docutils literal notranslate\">Sum</code></a> för att returnera ett annat standardvärde om inga böcker kan hittas:</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>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"go\">{&quot;price__sum&quot;: Decimal(&quot;0&quot;)}</span>\n</code></pre></div>\n<p>Under huven implementeras argumentet <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> genom att aggregeringsfunktionen förpackas med <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#django.db.models.functions.Coalesce\" title=\"django.db.models.functions.Coalesce\"><code class=\"xref py py-class docutils literal notranslate\">Coalesce</code></a>.</p>\n</section>\n<section id=\"aggregating-with-mysql-only-full-group-by-enabled\">\n<span id=\"aggregation-mysql-only-full-group-by\"></span><h3>Aggregating with MySQL <code class=\"docutils literal notranslate\">ONLY_FULL_GROUP_BY</code> enabled<a class=\"heading-anchor\" href=\"#aggregating-with-mysql-only-full-group-by-enabled\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When using the <code class=\"docutils literal notranslate\">values()</code> clause to group query results for annotations in\nMySQL with the <code class=\"docutils literal notranslate\">ONLY_FULL_GROUP_BY</code> SQL mode enabled, you may need to apply\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\">AnyValue</code></a> if the annotation includes a mix of\naggregate and non-aggregate expressions.</p>\n<p>Take the following example:</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\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Count<span class=\"p\">,</span> Greatest\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>greatest_pages<span class=\"o\">=</span>Greatest<span class=\"p\">(</span><span class=\"s2\">&quot;pages&quot;</span><span class=\"p\">,</span> <span class=\"mi\">600</span><span class=\"p\">))</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    pages_per_author<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;greatest_pages&quot;</span><span class=\"p\">)</span> <span class=\"o\">/</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;pages_per_author&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>This creates groups of books based on the SQL column <code class=\"docutils literal notranslate\">GREATEST(pages, 600)</code>.\nOne unique group consists of books with 600 pages or less, and other unique\ngroups will consist of books with the same pages. The <code class=\"docutils literal notranslate\">pages_per_author</code>\nannotation is composed of aggregate and non-aggregate expressions,\n<code class=\"docutils literal notranslate\">num_authors</code> is an aggregate expression while <code class=\"docutils literal notranslate\">greatest_page</code> isn’t.</p>\n<p>Since the grouping is based on the <code class=\"docutils literal notranslate\">greatest_pages</code> expression, MySQL may be\nunable to determine that <code class=\"docutils literal notranslate\">greatest_pages</code> (used in the <code class=\"docutils literal notranslate\">pages_per_author</code>\nexpression) is functionally dependent on the grouped column. As a result, it\nmay raise an error like:</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</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=\"Pytb code\"><code><span class=\"x\">OperationalError: (1055, &quot;Expression #2 of SELECT list is not in GROUP BY</span>\n<span class=\"x\">clause and contains nonaggregated column &#39;book_book.pages&#39; which is not</span>\n<span class=\"x\">functionally dependent on columns in GROUP BY clause; this is incompatible</span>\n<span class=\"x\">with sql_mode=only_full_group_by&quot;)</span>\n</code></pre></div>\n<p>To avoid this, you can wrap the non-aggregate expression with\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\">AnyValue</code></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=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Count<span class=\"p\">,</span> Greatest\n<span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    greatest_pages<span class=\"o\">=</span>Greatest<span class=\"p\">(</span><span class=\"s2\">&quot;pages&quot;</span><span class=\"p\">,</span> <span class=\"mi\">600</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    num_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    pages_per_author<span class=\"o\">=</span>AnyValue<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;greatest_pages&quot;</span><span class=\"p\">))</span> <span class=\"o\">/</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;pages_per_author&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;pages_per_author__avg&#39;: 532.57143333}</span>\n</code></pre></div>\n<p>Other supported databases do not encounter the <code class=\"docutils literal notranslate\">OperationalError</code> in the\nexample above because they can detect the functional dependency. In general,\n<code class=\"docutils literal notranslate\">AnyValue</code> is useful when dealing with select list columns that involve\nnon-aggregate functions or complex expressions not recognized by the database\nas functionally dependent on the columns in the grouping clause.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>The <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\">AnyValue</code></a> aggregate was added.</p>\n</aside>\n</section>\n</section>","rootId":"aggregation","toc":[{"title":"Fuskark","anchor":"cheat-sheet","children":[]},{"title":"Generera aggregat över en QuerySet","anchor":"generating-aggregates-over-a-queryset","children":[]},{"title":"Generera aggregat för varje objekt i en QuerySet","anchor":"generating-aggregates-for-each-item-in-a-queryset","children":[{"title":"Kombinera flera aggregat","anchor":"combining-multiple-aggregations","children":[]}]},{"title":"Sammanfogningar och aggregat","anchor":"joins-and-aggregates","children":[{"title":"Följa relationer baklänges","anchor":"following-relationships-backwards","children":[]}]},{"title":"Aggregeringar och andra QuerySet-klausuler","anchor":"aggregations-and-other-queryset-clauses","children":[{"title":"filter() och exkludera()","anchor":"filter-and-exclude","children":[{"title":"Filtrering av anteckningar","anchor":"filtering-on-annotations","children":[]},{"title":"Ordningsföljd för annotate() och filter() klausuler","anchor":"order-of-annotate-and-filter-clauses","children":[]}]},{"title":"order_by()","anchor":"order-by","children":[]},{"title":"värden()","anchor":"values","children":[{"title":"Ordningsföljd för klausulerna annotate() och values()","anchor":"order-of-annotate-and-values-clauses","children":[]},{"title":"Interaktion med order_by()","anchor":"interaction-with-order-by","children":[]}]},{"title":"Aggregering av anteckningar","anchor":"aggregating-annotations","children":[]},{"title":"Aggregering på tomma querysets eller grupper","anchor":"aggregating-on-empty-querysets-or-groups","children":[]},{"title":"Aggregating with MySQL ONLY_FULL_GROUP_BY enabled","anchor":"aggregating-with-mysql-only-full-group-by-enabled","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"},{"docname":"topics/db/index","title":"Modeller och databaser","url":"/sv/6.0/topics/db/"}],"prev":{"docname":"topics/db/queries","title":"Göra förfrågningar","url":"/sv/6.0/topics/db/queries/"},"next":{"docname":"topics/db/search","title":"Sök","url":"/sv/6.0/topics/db/search/"},"formats":{"html":"/sv/6.0/topics/db/aggregation/","markdown":"/sv/6.0/topics/db/aggregation.md","json":"/sv/6.0/topics/db/aggregation.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/db/aggregation.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/db/aggregation/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}