{"title":"Pengumpulan","version":"6.1","locale":"id","docname":"topics/db/aggregation","url":"/id/6.1/topics/db/aggregation/","canonical":"https://djangodocs.dev/id/6.1/topics/db/aggregation/","summary":"Panduan topik pada Django's database-abstraction API menggambarkan cara dimana anda dapat menggunakan permintaan Django yang membuat, mengambil, memperbaharui dan…","html":"<h1>Pengumpulan<a class=\"heading-anchor\" href=\"#aggregation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Panduan topik pada <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/\"><span class=\"doc\">Django's database-abstraction API</span></a> menggambarkan cara dimana anda dapat menggunakan permintaan Django yang membuat, mengambil, memperbaharui dan menghapus obyek tersendiri. Bagaimanapun, terkadang anda akan butuh mengambil nilai yang berasal oleh meringkas atau*mengumpulkan* kumpulan dari obyek. Topik panduan ini menggambarkan cara yang mengumpulkan nilai-nilai dapat dibangkitkan dan dikembalikan menggunakan permintaan Django.</p>\n<p>Sepanjang panduan ini, kami akan mengacu ke model berikut. Model-model ini digunakan untuk melacak inventaris untuk rangkaian dari toko buku daring:</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=\"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\">Author</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\">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\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">age</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Publisher</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\">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\">300</span><span class=\"p\">)</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\">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\">300</span><span class=\"p\">)</span>\n    <span class=\"n\">pages</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">price</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DecimalField</span><span class=\"p\">(</span><span class=\"n\">max_digits</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"n\">decimal_places</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">rating</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">)</span>\n    <span class=\"n\">publisher</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\">Publisher</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=\"n\">pubdate</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Store</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\">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\">300</span><span class=\"p\">)</span>\n    <span class=\"n\">books</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"cheat-sheet\">\n<h2>Lembar curang<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>Terburu-buru? Ini adalah bagaimana melakukan permintaan pengumpulan umum, menganggap model diatas:</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><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><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><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">publisher__name</span><span class=\"o\">=</span><span class=\"s2\">&quot;BaloneyPress&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">count</span><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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> <span class=\"n\">default</span><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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Max</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> <span class=\"n\">default</span><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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FloatField</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">price_diff</span><span class=\"o\">=</span><span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">FloatField</span><span class=\"p\">())</span> <span class=\"o\">-</span> <span class=\"n\">Avg</span><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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_books</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publisher: BaloneyPress&gt;, &lt;Publisher: SalamiPress&gt;, ...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">above_5</span> <span class=\"o\">=</span> <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">book__rating__gt</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">below_5</span> <span class=\"o\">=</span> <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">book__rating__lte</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">below_5</span><span class=\"o\">=</span><span class=\"n\">below_5</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">above_5</span><span class=\"o\">=</span><span class=\"n\">above_5</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">above_5</span>\n<span class=\"go\">23</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pubs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">below_5</span>\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><span class=\"n\">pubs</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_books</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">order_by</span><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><span class=\"n\">pubs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\n<span class=\"go\">1323</span>\n</code></pre></div>\n</section>\n<section id=\"generating-aggregates-over-a-queryset\">\n<h2>Membangkitkan pengumpulan terhadap <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></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 provides two ways to generate aggregates. The first way is to generate\nsummary values over an entire <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. For example, say you wanted to\ncalculate the average price of all books available for sale. Django's query\nsyntax provides a means for describing the set of all books:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>What we need is a way to calculate summary values over the objects that\nbelong to this <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. This is done by appending an <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code>\nclause onto the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code> is redundant in this example, so this could be simplified to:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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>Argumen pada klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> menggambarkan nilai pengumpulan yang kami ingin hitung - dalam kasus ini, rata-rata dari bidang <code class=\"docutils literal notranslate\"><span class=\"pre\">price</span></code> pada model <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>. Sebuah daftar dari fungsi pengumpulan yang tersedia dapat ditemukan di <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">QuerySet reference</span></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> is a terminal clause for a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> that, when invoked,\nreturns a dictionary of name-value pairs. The name is an identifier for the\naggregate value; the value is the computed aggregate. The name is\nautomatically generated from the name of the field and the aggregate function.\nIf you want to manually specify a name for the aggregate value, you can do so\nby providing that name when you specify the aggregate clause:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">average_price</span><span class=\"o\">=</span><span class=\"n\">Avg</span><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>If you want to generate more than one aggregate, you add another argument to\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> clause. So, if we also wanted to know the maximum and\nminimum price of all books, we would issue the query:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span><span class=\"p\">,</span> <span class=\"n\">Max</span><span class=\"p\">,</span> <span class=\"n\">Min</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">),</span> <span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">),</span> <span class=\"n\">Min</span><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>Membangkitkan pengumpulan untuk setiap barang di <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></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>The second way to generate summary values is to generate an independent\nsummary for each object in a <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a>. For example, if you are\nretrieving a list of books, you may want to know how many authors contributed\nto each book. Each Book has a many-to-many relationship with the Author; we\nwant to summarize this relationship for each book in the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Per-object summaries can be generated using the\n<a class=\"reference internal\" href=\"/id/6.1/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\"><span class=\"pre\">annotate()</span></code></a> clause. When an <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> clause is\nspecified, each object in the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> will be annotated with the\nspecified values.</p>\n<p>The syntax for these annotations is identical to that used for the\n<a class=\"reference internal\" href=\"/id/6.1/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\"><span class=\"pre\">aggregate()</span></code></a> clause. Each argument to <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> describes\nan aggregate that is to be calculated. For example, to annotate books with the\nnumber of authors:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><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><span class=\"n\">q</span><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><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">authors__count</span>\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><span class=\"n\">q</span><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><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">authors__count</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>As with <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code>, the name for the annotation is automatically derived\nfrom the name of the aggregate function and the name of the field being\naggregated. You can override this default name by providing an alias when you\nspecify the annotation:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">num_authors</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">num_authors</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>Tidak seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> adalah <em>bukan</em> klausa terminal. Keluaran dari klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> adalah sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>; <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> ini dapat dirubah menggunakan apapun selain operasi <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, termasuk <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code>, atau bahkan tambahan panggilan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code>.</p>\n<section id=\"combining-multiple-aggregations\">\n<span id=\"id1\"></span><h3>Memadukan banyak pengumpulan<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>Combining multiple aggregations with <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> will <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/10060\">yield the\nwrong results</a> because joins are used instead of 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><span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">first</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">store_set</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n<span class=\"go\">3</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span> <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;store&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">authors__count</span>\n<span class=\"go\">6</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">store__count</span>\n<span class=\"go\">6</span>\n</code></pre></div>\n<p>Untuk kebanyakan pengumpulan, tidak ada jalan menghindari masalah ini, bagaimanapun, pengumpulan <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.Count\" title=\"django.db.models.Count\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Count</span></code></a> mempunai sebuah parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct</span></code> yang mungkin membantu:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">,</span> <span class=\"n\">distinct</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span> <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;store&quot;</span><span class=\"p\">,</span> <span class=\"n\">distinct</span><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><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">authors__count</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">store__count</span>\n<span class=\"go\">3</span>\n</code></pre></div>\n<aside class=\"admonition-if-in-doubt-inspect-the-sql-query admonition\">\n<p class=\"admonition-title\">Jika ragu, periksa permintaan SQL!</p>\n<p>Untuk memahami apa yang terjadi di permintaan anda, pertimbangkan memeriksa sifat <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> dari <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> anda.</p>\n</aside>\n</section>\n</section>\n<section id=\"joins-and-aggregates\">\n<h2>Gabung dan kumpulkan<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>Sejauh ini, kami telah berurusan dengan pengumpulan terhadap bidang yang milik ke model sedang diminta. Bagaimanapun, terkadang nilai anda ingin kumpulkan akan milik ke model yang terkait ke model anda sedang meminta.</p>\n<p>Ketika anda menentukan bidang untuk dikumpulkan dalam sebuah fungsi pengumpulan, Django akan mengizinkan anda menggunakan <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">double underscore notation</span></a> sama yang digunakan ketika mengacu ke bidang terkait dalam penyaring. Django akan kemudian menangani gabungan table apapun yang dibutuhkan untuk mengambil dan mengumpulkan nilai terkait.</p>\n<p>For example, to find the price range of books offered in each store,\nyou could use the annotation:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Max</span><span class=\"p\">,</span> <span class=\"n\">Min</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Store</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">min_price</span><span class=\"o\">=</span><span class=\"n\">Min</span><span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">),</span> <span class=\"n\">max_price</span><span class=\"o\">=</span><span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Ini memberitahu Django untuk mengambil model <code class=\"docutils literal notranslate\"><span class=\"pre\">Store</span></code>, gabung (melalui hubungan many-to-many) dengan model <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>, dan dikumpulkan pada bidang harga dari model buku untuk menghasilkan sebuah nilai minimal dan maksimal.</p>\n<p>The same rules apply to the <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> clause. If you wanted to\nknow the lowest and highest price of any book that is available for sale\nin any of the stores, you could use the aggregate:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Store</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">min_price</span><span class=\"o\">=</span><span class=\"n\">Min</span><span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">),</span> <span class=\"n\">max_price</span><span class=\"o\">=</span><span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;books__price&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Join chains can be as deep as you require. For example, to extract the\nage of the youngest author of any book available for sale, you could\nissue the query:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Store</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">youngest_age</span><span class=\"o\">=</span><span class=\"n\">Min</span><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>Mengikuti hubungan kebelakang<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>Dalam sebuah cara mirip pada <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#lookups-that-span-relationships\"><span class=\"std std-ref\">Pencarian yang menjangkau hubungan</span></a>, pengumpulan dan catatan pada bidang dari model atau model yang terkait ke satu anda sedang meminta dapat menyertakan lintasan hubungan &quot;reverse&quot;. Nama huruf kecil dari model terkait dan garis bawah ganda digunakan disini juga.</p>\n<p>For example, we can ask for all publishers, annotated with their respective\ntotal book stock counters (note how we use <code class=\"docutils literal notranslate\"><span class=\"pre\">'book'</span></code> to specify the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Publisher</span></code> -&gt; <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> reverse foreign key hop):</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span><span class=\"p\">,</span> <span class=\"n\">Count</span><span class=\"p\">,</span> <span class=\"n\">Min</span><span class=\"p\">,</span> <span class=\"n\">Sum</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Setiap <code class=\"docutils literal notranslate\"><span class=\"pre\">Publisher</span></code> dalam menghasilkan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> akan mempunyai sebuah atribut tambahan disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">book__count</span></code>.)</p>\n<p>We can also ask for the oldest book of any of those managed by every publisher:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">oldest_pubdate</span><span class=\"o\">=</span><span class=\"n\">Min</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__pubdate&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Hasil kamus akan mempunyai sebuah kunci dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">'oldest_pubdate'</span></code>. Jika tidak ada nama lain seperti itu telah ditentukan, itu akan agak panjang <code class=\"docutils literal notranslate\"><span class=\"pre\">'book__pubdate__min'</span></code>.)</p>\n<p>This doesn't apply just to foreign keys. It also works with many-to-many\nrelations. For example, we can ask for every author, annotated with the total\nnumber of pages considering all the books the author has (co-)authored (note\nhow we use <code class=\"docutils literal notranslate\"><span class=\"pre\">'book'</span></code> to specify the <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> -&gt; <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> reverse\nmany-to-many hop):</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">total_pages</span><span class=\"o\">=</span><span class=\"n\">Sum</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__pages&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Setiap <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> dalam menghasilkan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> akan mempunyai sebuah atribut tambahan dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">total_pages</span></code>. Jika tidak ada nama lain itu, itu akan menjadi agak panjang <code class=\"docutils literal notranslate\"><span class=\"pre\">book__pages__sum</span></code>.)</p>\n<p>Or ask for the average rating of all the books written by author(s) we have on\nfile:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">average_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Hasil kamus akan mempunyai sebuah kunci dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">'average_rating'</span></code>. Jika tidak ada nama lain seperti itu telah ditentukan, itu akan agak panjang <code class=\"docutils literal notranslate\"><span class=\"pre\">'book__rating__avg'</span></code>.)</p>\n</section>\n</section>\n<section id=\"aggregations-and-other-queryset-clauses\">\n<h2>Pengumpulan dan klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> lain<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\"><span class=\"pre\">filter()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></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>Pengumpulan dapat juga ikut serta dalam penyaring. <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> (atau``exclude()``) apapun berlaku pada bidang model biasa akan mempunyai pengaruh dari membatasi obyek yang dianggap untuk pengumpulan.</p>\n<p>When used with an <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> clause, a filter has the effect of\nconstraining the objects for which an annotation is calculated. For example,\nyou can generate an annotated list of all books that have a title starting\nwith &quot;Django&quot; using the query:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span><span class=\"p\">,</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Django&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>When used with an <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> clause, a filter has the effect of\nconstraining the objects over which the aggregate is calculated.\nFor example, you can generate the average price of all books with a\ntitle that starts with &quot;Django&quot; using the query:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Django&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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>Penyaringan pada keterangan<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>Nilai dicatat dapat juga disaring. Nama lain untuk catatan dapat digunaan dalam klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> di cara sama seperti bidang model lainnya apapun.</p>\n<p>For example, to generate a list of books that have more than one author,\nyou can issue the query:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">num_authors__gt</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Permintaan ini membangkitkan sebuah kumpulan hasil keterangan, dan kemudian membangkitkan sebuah penyaring berdasarkan pada keterangan itu.</p>\n<p>If you need two annotations with two separate filters you can use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code> argument with any aggregate. For example, to generate a list of\nauthors with a count of highly rated books:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">highly_rated</span> <span class=\"o\">=</span> <span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">book__rating__gte</span><span class=\"o\">=</span><span class=\"mi\">7</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_books</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">),</span> <span class=\"n\">highly_rated_books</span><span class=\"o\">=</span><span class=\"n\">highly_rated</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Each <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> in the result set will have the <code class=\"docutils literal notranslate\"><span class=\"pre\">num_books</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">highly_rated_books</span></code> attributes. See also <a class=\"reference internal\" href=\"/id/6.1/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">Pengumpulan bersyarat</span></a>.</p>\n<aside class=\"admonition-choosing-between-filter-and-queryset-filter admonition\">\n<p class=\"admonition-title\">Memilih diantara <code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.filter()</span></code></p>\n<p>Hidnari menggunakan argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code> dengan keterangan atau pengumpulan tunggal. Itu lebih efesien menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.filter()</span></code> untuk tidak menyertakan baris. Argumen pengumpulan <code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code> hanya berguna ketika menggunakan dua atau lebih pengumpulan terhadap hubungan sama dengan keadaan berbeda.</p>\n</aside>\n</section>\n<section id=\"order-of-annotate-and-filter-clauses\">\n<h4>Urutan dari klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code><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>Ketika mengembangkan sebuah permintaan rumit yang melibatkan kedua klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, berikan perhatian khusus pada urutan dimana klausa diberlakukan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Ketika sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> diberlakukan pada sebuah permintaan, catatan dihitung terhadap keadaan dari permintaan sampai titik dimana catatan diminta. Impliaksi praktik dari ini adalah bahwa <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> bukan operasi komutatif.</p>\n<p>Diberikan:</p>\n<ul class=\"simple\">\n<li><p>Penerbit A mempunyai dua buku dengan nilai 4 dan 5.</p></li>\n<li><p>Penerbit B mempunyai dua buku dengan nilai 1 dan 4.</p></li>\n<li><p>Penerbit C mempunyai satu buku dengan penilaian 1.</p></li>\n</ul>\n<p>Berikut adalah contoh dengan kumpulan <code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></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=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_books</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span> <span class=\"n\">distinct</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">book__rating__gt</span><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><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\n<span class=\"go\">(&lt;Publisher: A&gt;, 2)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\n<span class=\"go\">(&lt;Publisher: B&gt;, 2)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">book__rating__gt</span><span class=\"o\">=</span><span class=\"mf\">3.0</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_books</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\n<span class=\"go\">(&lt;Publisher: A&gt;, 2)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">num_books</span>\n<span class=\"go\">(&lt;Publisher: B&gt;, 1)</span>\n</code></pre></div>\n<p>Kedua permintaan mengembalikan sebuah daftar dari penerbit yang mempunyai setidaknya satu buku dengan penilaian melebihi 3.0, karenanya penerbit C tidak disertakan.</p>\n<p>Dalam permintaan pertama, catatan mendahului penyaring, jadi penyaring tidak mempunyai pengaruh pada catatan. <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code> dibutuhkan untuk menghindari <a class=\"reference internal\" href=\"#combining-multiple-aggregations\"><span class=\"std std-ref\">query bug</span></a>.</p>\n<p>Permintaan kedua menghitung jumlah buku yang mempunyai nilai melebihi 3.0 untuk setiap penerbit. Penyaring ini mendahului catatan, jadi batasan penyaring obyek dianggap ketika menghitung catatan.</p>\n<p>Berikut contoh lain dengan kumpulan <code class=\"docutils literal notranslate\"><span class=\"pre\">Rata-Rata</span></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=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">avg_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">book__rating__gt</span><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><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">avg_rating</span>\n<span class=\"go\">(&lt;Publisher: A&gt;, 4.5)  # (5+4)/2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">avg_rating</span>\n<span class=\"go\">(&lt;Publisher: B&gt;, 2.5)  # (1+4)/2</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Publisher</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">book__rating__gt</span><span class=\"o\">=</span><span class=\"mf\">3.0</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">avg_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><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><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">avg_rating</span>\n<span class=\"go\">(&lt;Publisher: A&gt;, 4.5)  # (5+4)/2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">avg_rating</span>\n<span class=\"go\">(&lt;Publisher: B&gt;, 4.0)  # 4/1 (book with rating 1 excluded)</span>\n</code></pre></div>\n<p>Permintaan pertama meminta untuk rata-rata penilaian dari semua penerbit buku untuk penerbit yang mempunyai setidaknya satu buku ketika penilaian melebihi 3.0. Permintaan kedua meminta untuk rata-rata dari penilaian buku penerbit untuk hanya mereka penilaian melebihi 3.0.</p>\n<p>Itu adalah sangat sulit memahami bahwa ORM akan menterjemahkan queryset rumit kedalam permintaan SQL ketika dalam keraguan, periksa SQL dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">str(queryset.query)</span></code> dan tulis jumlah besar percobaan.</p>\n</section>\n</section>\n<section id=\"order-by\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></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>Catatan dapat digunakan sebagai dasar untuk pengurutan. Ketika anda menentukan sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code>, pengumpulan anda sediakan dapat mengacu nama lain apapun ditentukan sebagai bagian dari sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dalam permintaan.</p>\n<p>Misalnya, untuk mengurutkan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> buku berdasarkan jumlah penulis yang berkontribusi pada buku, anda dapat menggunakan permintaan berikut:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">order_by</span><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\"><span class=\"pre\">values()</span></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>Biasanya, catatan dibangkitkan pada dasar per-obyek - sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dicatat akan mengembalikan satu hasil untuk setiap obyek dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> asli. Bagaimanapun, ketika sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> digunakan untuk membatasi kolom yang dikembalikan dalam kumpulan hasil, metode untuk menilai catatan adak sedikit berbeda. Sebagai gantinya mengembalikan sebuah hasil dicatat untuk setiap hasil dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> asli, hasil asli dikelompokkan menurut pada perpaduan unik dari bidang-bidang ditentukan dalam klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>.  Sebuah catatam kemudian disediakan untuk setiap kelompok unik; catatan dihitung terhadap semua anggota dari kelompok.</p>\n<p>Untuk setiap contoh, pertimbangkan sebuah permintaan penulis yang berusaha menemukan rata-rata penilaian dari buku ditulis oleh setiap penulis.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">average_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Ini akan mengembalikan satu hasil untuk setiap penulis di basisdata, diberikan keterangan dengan nilai buku rata-rata mereka.</p>\n<p>Namun, hasilnya akan sedikit berbeda jika anda menggunakan klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></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=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">average_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Dalam contoh ini, penulis akan dikelompokkan berdasarkan nama, jadi anda akan hanya mendapatkan sebuah hasil dicatata untuk setiap nama penulis <em>unik</em>. Ini berarti jika anda mempunyai dua penulis dengan nama sama, hasil mereka akan digabung kedalam hasil tunggal di keluaran dari permintaan; rata-rata akan dihitung sebagai rata-rata terhadap buku ditulis oleh kedua penulis.</p>\n<section id=\"order-of-annotate-and-values-clauses\">\n<h4>Urutan dari klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></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>Seperti klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, urutan dimana klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> diberlakukan pada sebuah permintaan adalah signifikan. Jika klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> mendahului <code class=\"docutils literal notranslate\"><span class=\"pre\">annotated()</span></code>, catatan akan dihitung menggunakan pengelomppokan digambarkan oleh klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>.</p>\n<p>Bagaimanapun, jika klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> mendahului klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>, catatan akan dibangkitkan terhadap keseluruhan kumpulan permintaan. Dalam kasus ini, klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> hanya membatasi bidang yang dibangkitkan pada keluaran.</p>\n<p>Misalnya, jika kita membalikkan urutan klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> dari contoh kita sebelumnya:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">average_rating</span><span class=\"o\">=</span><span class=\"n\">Avg</span><span class=\"p\">(</span><span class=\"s2\">&quot;book__rating&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">values</span><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>Ini akan sekarang menghasilkan hasil unik untuk setiap penulis; bagaimanapun, hanya nama penulis dan catatan <code class=\"docutils literal notranslate\"><span class=\"pre\">average_rating</span></code> akan dikembalikan dalam data keluaran.</p>\n<p>Anda harus juga catat bahwa <code class=\"docutils literal notranslate\"><span class=\"pre\">average_rating</span></code> telah jelas disertakan dalam daftar dari nilai-nilai untuk dikembalikan. Ini dibutuhkan karena dari urutan dari klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code>.</p>\n<p>Jika klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> mendahului klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code>, setiap catatan akan otomatis ditambahkan ke kumpulan hasil. Bagaimanapun, jika klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> diberlakukan setelah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code>, anda butuh jelas menyertakan kolom pengumpulan.</p>\n</section>\n<section id=\"interaction-with-order-by\">\n<span id=\"aggregation-ordering-interaction\"></span><h4>Interaksi dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></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>Bidang yang disebutkan di bagian <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> dari kumpulan permintaan digunakan saat memilih data keluaran, bahkan jika bidang tersebut tidak ditentukan lain dalam panggilan <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>. Bidang tambahan ini digunakan untuk mengelompokkan hasil &quot;suka&quot; bersama-sama dan mereka dapat membuat baris hasil identik tampak terpisah. Ini muncul, terutama, saat menghitung sesuatu.</p>\n<p>Berdasarkan cara contoh, seharusnya anda mempunyai model seperti ini:</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\">Item</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\">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\">10</span><span class=\"p\">)</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>If you want to count how many times each distinct <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> value appears in an\nordered queryset, you might try this:</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\">items</span> <span class=\"o\">=</span> <span class=\"n\">Item</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"c1\"># Warning: not quite correct!</span>\n<span class=\"n\">items</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>...which will group the <code class=\"docutils literal notranslate\"><span class=\"pre\">Item</span></code> objects by their common <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> values and\nthen count the number of <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> values in each group. Except that it won't\nquite work. The ordering by <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> will also play a part in the grouping, so\nthis query will group by distinct <code class=\"docutils literal notranslate\"><span class=\"pre\">(data,</span> <span class=\"pre\">name)</span></code> pairs, which isn't what you\nwant. Instead, you should construct this 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><span class=\"n\">items</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>...membersihkan pengurutan apapun di permintaan. Anda dapat juga mengurutkan berdasarkan, katakan, <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> tanpa pengaruh berbahaya apapun, sejak itu sudah bermain sebuah peran dalam permintaan.</p>\n<p>Perilaku ini adalah sama seperti dicatat dalam dokumentasi queryset untuk <a class=\"reference internal\" href=\"/id/6.1/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\"><span class=\"pre\">distinct()</span></code></a> dan aturan umum adalah sama: biasanya anda tidak ingin kolom tambahan bermain bagian dalam hasil, jadi bersihkan pengurutan, atau setidaknya pastikan itu terbatas hanya bidang-bidang tersebut anda juga pilih dalam sebuah panggilan <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</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\"><span class=\"pre\">distinct()</span></code> and other\nplaces: Django <strong>never</strong> removes ordering constraints that you have\nspecified <em>explicitly with</em> <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> (and we can't change those\nother methods' behavior, as that would violate our\n<a class=\"reference internal\" href=\"/id/6.1/misc/api-stability/\"><span class=\"doc\">Keseimbangan API</span></a> policy).</p>\n</aside>\n<aside class=\"admonition-default-ordering-not-applied-to-group-by admonition\">\n<p class=\"admonition-title\">Default ordering not applied to GROUP BY</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">GROUP</span> <span class=\"pre\">BY</span></code> queries (for example, those using <code class=\"docutils literal notranslate\"><span class=\"pre\">.values()</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">.annotate()</span></code>) don't use the model's default ordering.\nUse <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> explicitly when a given order is needed.</p>\n</aside>\n</section>\n</section>\n<section id=\"aggregating-annotations\">\n<h3>Pengumpulan catatan<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>Anda dapat juga membangkitkan sebuah pengumpulan pada hasil dari sebuah catatan. Ketika anda menentukan sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code>, pengumpulan anda sediakan dapat mengacu setiap nama lain ditentukan sebagai bagian dari sebuah klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">annotated()</span></code> dalam permintaan.</p>\n<p>For example, if you wanted to calculate the average number of authors per\nbook you first annotate the set of books with the author count, then\naggregate that author count, referencing the annotation field:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Avg</span><span class=\"p\">,</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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>Aggregating on empty querysets or groups<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>When an aggregation is applied to an empty queryset or grouping, the result\ndefaults to its <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> parameter, typically\n<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. This behavior occurs because aggregate functions return <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> when\nthe executed query returns no rows.</p>\n<p>You can specify a return value by providing the <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> argument for most aggregations. However, since\n<a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.Count\" title=\"django.db.models.Count\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Count</span></code></a> does not support the <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> argument, it will always return <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> for empty querysets\nor groups.</p>\n<p>For example, assuming that no book contains <em>web</em> in its name, calculating the\ntotal price for this book set would return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> since there are no matching\nrows to compute the <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.Sum\" title=\"django.db.models.Sum\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Sum</span></code></a> aggregation on:</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Sum</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Sum</span><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>However, the <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> argument can be set when\ncalling <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.Sum\" title=\"django.db.models.Sum\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Sum</span></code></a> to return a different default value if\nno books can be found:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Sum</span><span class=\"p\">(</span><span class=\"s2\">&quot;price&quot;</span><span class=\"p\">,</span> <span class=\"n\">default</span><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 the hood, the <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#aggregate-default\"><span class=\"std std-ref\">default</span></a> argument is implemented\nby wrapping the aggregate function with\n<a class=\"reference internal\" href=\"/id/6.1/ref/models/database-functions/#django.db.models.functions.Coalesce\" title=\"django.db.models.functions.Coalesce\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Coalesce</span></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\"><span class=\"pre\">ONLY_FULL_GROUP_BY</span></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\"><span class=\"pre\">values()</span></code> clause to group query results for annotations in\nMySQL with the <code class=\"docutils literal notranslate\"><span class=\"pre\">ONLY_FULL_GROUP_BY</span></code> SQL mode enabled, you may need to apply\n<a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AnyValue</span></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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span><span class=\"p\">,</span> <span class=\"n\">Count</span><span class=\"p\">,</span> <span class=\"n\">Greatest</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">greatest_pages</span><span class=\"o\">=</span><span class=\"n\">Greatest</span><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><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pages_per_author</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;greatest_pages&quot;</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">F</span><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><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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\"><span class=\"pre\">GREATEST(pages,</span> <span class=\"pre\">600)</span></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\"><span class=\"pre\">pages_per_author</span></code>\nannotation is composed of aggregate and non-aggregate expressions,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">num_authors</span></code> is an aggregate expression while <code class=\"docutils literal notranslate\"><span class=\"pre\">greatest_page</span></code> isn't.</p>\n<p>Since the grouping is based on the <code class=\"docutils literal notranslate\"><span class=\"pre\">greatest_pages</span></code> expression, MySQL may be\nunable to determine that <code class=\"docutils literal notranslate\"><span class=\"pre\">greatest_pages</span></code> (used in the <code class=\"docutils literal notranslate\"><span class=\"pre\">pages_per_author</span></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=\"/id/6.1/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AnyValue</span></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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AnyValue</span><span class=\"p\">,</span> <span class=\"n\">F</span><span class=\"p\">,</span> <span class=\"n\">Count</span><span class=\"p\">,</span> <span class=\"n\">Greatest</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">greatest_pages</span><span class=\"o\">=</span><span class=\"n\">Greatest</span><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><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">num_authors</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pages_per_author</span><span class=\"o\">=</span><span class=\"n\">AnyValue</span><span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;greatest_pages&quot;</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">F</span><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><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Avg</span><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\"><span class=\"pre\">OperationalError</span></code> in the\nexample above because they can detect the functional dependency. In general,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">AnyValue</span></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\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>The <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.AnyValue\" title=\"django.db.models.AnyValue\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AnyValue</span></code></a> aggregate was added.</p>\n</aside>\n</section>\n</section>","rootId":"aggregation","toc":[{"title":"Lembar curang","anchor":"cheat-sheet","children":[]},{"title":"Membangkitkan pengumpulan terhadap QuerySet","anchor":"generating-aggregates-over-a-queryset","children":[]},{"title":"Membangkitkan pengumpulan untuk setiap barang di QuerySet","anchor":"generating-aggregates-for-each-item-in-a-queryset","children":[{"title":"Memadukan banyak pengumpulan","anchor":"combining-multiple-aggregations","children":[]}]},{"title":"Gabung dan kumpulkan","anchor":"joins-and-aggregates","children":[{"title":"Mengikuti hubungan kebelakang","anchor":"following-relationships-backwards","children":[]}]},{"title":"Pengumpulan dan klausa QuerySet lain","anchor":"aggregations-and-other-queryset-clauses","children":[{"title":"filter() dan exclude()","anchor":"filter-and-exclude","children":[{"title":"Penyaringan pada keterangan","anchor":"filtering-on-annotations","children":[]},{"title":"Urutan dari klausa annotate() dan filter()","anchor":"order-of-annotate-and-filter-clauses","children":[]}]},{"title":"order_by()","anchor":"order-by","children":[]},{"title":"values()","anchor":"values","children":[{"title":"Urutan dari klausa annotate() dan values()","anchor":"order-of-annotate-and-values-clauses","children":[]},{"title":"Interaksi dengan order_by()","anchor":"interaction-with-order-by","children":[]}]},{"title":"Pengumpulan catatan","anchor":"aggregating-annotations","children":[]},{"title":"Aggregating on empty querysets or groups","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":"Menggunakan Django","url":"/id/6.1/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/6.1/topics/db/"}],"prev":{"docname":"topics/db/fetch-modes","title":"Fetch modes","url":"/id/6.1/topics/db/fetch-modes/"},"next":{"docname":"topics/db/search","title":"Cari","url":"/id/6.1/topics/db/search/"},"formats":{"html":"/id/6.1/topics/db/aggregation/","markdown":"/id/6.1/topics/db/aggregation.md","json":"/id/6.1/topics/db/aggregation.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/aggregation.txt","official":"https://docs.djangoproject.com/id/6.1/topics/db/aggregation/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}