{"title":"Frågeuttryck","version":"6.0","locale":"sv","docname":"ref/models/expressions","url":"/sv/6.0/ref/models/expressions/","canonical":"https://djangodocs.dev/sv/6.0/ref/models/expressions/","summary":"Frågeuttryck beskriver ett värde eller en beräkning som kan användas som en del av en uppdatering, ett skapande, ett filter, en ordning efter, en annotering…","html":"<h1>Frågeuttryck<a class=\"heading-anchor\" href=\"#query-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Frågeuttryck beskriver ett värde eller en beräkning som kan användas som en del av en uppdatering, ett skapande, ett filter, en ordning efter, en annotering eller ett aggregat. När ett uttryck ger ett booleskt värde kan det användas direkt i filter. Det finns ett antal inbyggda uttryck (dokumenteras nedan) som kan användas för att hjälpa dig att skriva frågor. Uttryck kan kombineras, eller i vissa fall nästlas, för att bilda mer komplexa beräkningar.</p>\n<section id=\"supported-arithmetic\">\n<h2>Stöd för aritmetik<a class=\"heading-anchor\" href=\"#supported-arithmetic\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django stöder negation, addition, subtraktion, multiplikation, division, modulo aritmetik och power-operatorn på frågeuttryck med hjälp av Python-konstanter, variabler och till och med andra uttryck.</p>\n</section>\n<section id=\"output-field\">\n<span id=\"id1\"></span><h2>Utgångsfält<a class=\"heading-anchor\" href=\"#output-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Många av de uttryck som dokumenteras i detta avsnitt stöder en valfri parameter <code class=\"docutils literal notranslate\">output_field</code>. Om den anges kommer Django att ladda värdet i det fältet efter att ha hämtat det från databasen.</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> tar en modellfältsinstans, som <code class=\"docutils literal notranslate\">IntegerField()</code> eller <code class=\"docutils literal notranslate\">BooleanField()</code>. Vanligtvis behöver fältet inte några argument, som <code class=\"docutils literal notranslate\">max_length</code>, eftersom fältargument avser datavalidering som inte kommer att utföras på uttryckets utdatavärde.</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> krävs endast när Django inte automatiskt kan bestämma resultatets fälttyp, till exempel komplexa uttryck som blandar fälttyper. Om du till exempel lägger till en <code class=\"docutils literal notranslate\">DecimalField()</code> och en <code class=\"docutils literal notranslate\">FloatField()</code> krävs ett utmatningsfält, som <code class=\"docutils literal notranslate\">output_field=FloatField()</code>.</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> also allows using custom fields that perform type conversions\noutside a specific model field context. For example, if you frequently need to\nperform date arithmetic with <code class=\"docutils literal notranslate\">timedelta</code>, you can create a custom field that\nhandles the conversion, ensuring consistent results across databases. See\n<a class=\"reference internal\" href=\"/sv/6.0/howto/custom-model-fields/\"><span class=\"doc\">Så här skapar du anpassade modellfält</span></a>.</p>\n</section>\n<section id=\"some-examples\">\n<h2>Några exempel<a class=\"heading-anchor\" href=\"#some-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count<span class=\"p\">,</span> F<span class=\"p\">,</span> Value\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length<span class=\"p\">,</span> Upper\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.lookups</span> <span class=\"kn\">import</span> GreaterThan\n\n<span class=\"go\"># Find companies that have more employees than chairs.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n\n<span class=\"go\"># Find companies that have at least twice as many employees</span>\n<span class=\"go\"># as chairs. Both the querysets below are equivalent.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n\n<span class=\"go\"># How many chairs are needed for each company to seat all employees?</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>annotate<span class=\"p\">(</span>chairs_needed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">-</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>first<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>num_employees\n<span class=\"go\">120</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>num_chairs\n<span class=\"go\">50</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>chairs_needed\n<span class=\"go\">70</span>\n\n<span class=\"go\"># Create a new company using expressions.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Google&quot;</span><span class=\"p\">,</span> ticker<span class=\"o\">=</span>Upper<span class=\"p\">(</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;goog&quot;</span><span class=\"p\">)))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>ticker\n<span class=\"go\">&#39;GOOG&#39;</span>\n\n<span class=\"go\"># Annotate models with an aggregated value. Both forms</span>\n<span class=\"go\"># below are equivalent.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_products<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_products<span class=\"o\">=</span>Count<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">)))</span>\n\n<span class=\"go\"># Aggregates can contain complex computations also</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_offerings<span class=\"o\">=</span>Count<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;services&quot;</span><span class=\"p\">)))</span>\n\n<span class=\"go\"># Expressions can also be used in order_by(), either directly</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Length<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>asc<span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Length<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">())</span>\n<span class=\"go\"># or using the double underscore lookup syntax.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> CharField\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length\n<span class=\"gp\">&gt;&gt;&gt; </span>CharField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>Length<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name__length&quot;</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Boolean expression can be used directly in filters.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Exists<span class=\"p\">,</span> OuterRef\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Exists<span class=\"p\">(</span>Employee<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>company<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">),</span> salary__gt<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n\n<span class=\"go\"># Lookup expressions can also be used directly in filters</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>GreaterThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)))</span>\n<span class=\"go\"># or annotations.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    need_chairs<span class=\"o\">=</span>GreaterThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"built-in-expressions\">\n<h2>Inbyggda uttryck<a class=\"heading-anchor\" href=\"#built-in-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Dessa uttryck definieras i <code class=\"docutils literal notranslate\">django.db.models.expressions</code> och <code class=\"docutils literal notranslate\">django.db.models.aggregates</code>, men för enkelhetens skull är de tillgängliga och importeras vanligtvis från <a class=\"reference internal\" href=\"/sv/6.0/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models</code></a>.</p>\n</aside>\n<section id=\"f-expressions\">\n<h3><code class=\"docutils literal notranslate\">F()</code>-uttryck<a class=\"heading-anchor\" href=\"#f-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.F\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">F</span><a class=\"heading-anchor\" href=\"#django.db.models.F\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ett <code class=\"docutils literal notranslate\">F()</code>-objekt representerar värdet av ett modellfält, transformerat värde av ett modellfält eller annoterad kolumn. Det gör det möjligt att referera till modellfältsvärden och utföra databasoperationer med hjälp av dem utan att faktiskt behöva dra ut dem från databasen till Python-minnet.</p>\n<p>Istället använder Django objektet <code class=\"docutils literal notranslate\">F()</code> för att generera ett SQL-uttryck som beskriver den nödvändiga operationen på databasnivå.</p>\n<p>Låt oss prova detta med ett exempel. Normalt kan man göra något liknande:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Tintin filed a news story!</span>\nreporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>stories_filed <span class=\"o\">+=</span> <span class=\"mi\">1</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Här har vi hämtat värdet av <code class=\"docutils literal notranslate\">reporter.stories_filed</code> från databasen till minnet och manipulerat det med hjälp av välkända Python-operatorer, och sedan sparat objektet tillbaka till databasen. Men istället kunde vi också ha gjort:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nreporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>stories_filed <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Även om <code class=\"docutils literal notranslate\">reporter.stories_filed = F('stories_filed') + 1</code> ser ut som en normal Python-tilldelning av värde till ett instansattribut, är det i själva verket en SQL-konstruktion som beskriver en operation i databasen.</p>\n<p>När Django stöter på en instans av <code class=\"docutils literal notranslate\">F()</code> åsidosätter den Pythons standardoperatorer för att skapa ett inkapslat SQL-uttryck; i det här fallet ett som instruerar databasen att öka databasfältet som representeras av <code class=\"docutils literal notranslate\">reporter.stories_filed</code>.</p>\n<p>Oavsett vilket värde som finns eller fanns på <code class=\"docutils literal notranslate\">reporter.stories_filed</code> får Python aldrig veta något om det - det hanteras helt och hållet av databasen. Allt Python gör, genom Djangos <code class=\"docutils literal notranslate\">F()</code>-klass, är att skapa SQL-syntaxen för att hänvisa till fältet och beskriva operationen.</p>\n<p>As well as being used in operations on single instances as above, <code class=\"docutils literal notranslate\">F()</code> can\nbe used with <code class=\"docutils literal notranslate\">update()</code> to perform bulk updates on a <code class=\"docutils literal notranslate\">QuerySet</code>. This\nreduces the two queries we were using above - the <code class=\"docutils literal notranslate\">get()</code> and the\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> - to just one:</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>reporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>update<span class=\"p\">(</span>stories_filed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>We can also use <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\">update()</code></a> to increment\nthe field value on multiple objects - which could be very much faster than\npulling them all into Python from the database, looping over them, incrementing\nthe field value of each one, and saving each one back to the database:</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>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>stories_filed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">F()</code> kan därför erbjuda prestandafördelar genom:</p>\n<ul class=\"simple\">\n<li><p>att få databasen, snarare än Python, att göra jobbet</p></li>\n<li><p>minska antalet förfrågningar som vissa operationer kräver</p></li>\n</ul>\n<section id=\"slicing-f-expressions\">\n<span id=\"slicing-using-f\"></span><h4>Skivning av <code class=\"docutils literal notranslate\">F()</code>-uttryck<a class=\"heading-anchor\" href=\"#slicing-f-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>För strängbaserade fält, textbaserade fält och <a class=\"reference internal\" href=\"/sv/6.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> kan du använda Pythons syntax för array-slicing. Indexen är 0-baserade. Argumentet <code class=\"docutils literal notranslate\">step</code> till <code class=\"docutils literal notranslate\">slice</code> och negativ indexering stöds inte. Till exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Replacing a name with a substring of itself.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer <span class=\"o\">=</span> Writers<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Priyansh&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>name <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>name\n<span class=\"go\">&#39;riya&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"avoiding-race-conditions-using-f\">\n<span id=\"id2\"></span><h4>Undvika tävlingsförhållanden med hjälp av <code class=\"docutils literal notranslate\">F()</code><a class=\"heading-anchor\" href=\"#avoiding-race-conditions-using-f\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>En annan fördel med <code class=\"docutils literal notranslate\">F()</code> är att om databasen - snarare än Python - uppdaterar ett fälts värde undviks ett <em>race condition</em>.</p>\n<p>Om två Python-trådar kör koden i det första exemplet ovan kan den ena tråden hämta, öka och spara ett fälts värde efter att den andra har hämtat det från databasen. Det värde som den andra tråden sparar kommer att baseras på det ursprungliga värdet; den första trådens arbete kommer att gå förlorat.</p>\n<p>If the database is responsible for updating the field, the process is more\nrobust: it will only ever update the field based on the value of the field in\nthe database when the <a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> or <code class=\"docutils literal notranslate\">update()</code> is executed, rather\nthan based on its value when the instance was retrieved.</p>\n</section>\n<section id=\"f-assignments-are-refreshed-after-model-save\">\n<h4><code class=\"docutils literal notranslate\">F()</code> assignments are refreshed after <code class=\"docutils literal notranslate\">Model.save()</code><a class=\"heading-anchor\" href=\"#f-assignments-are-refreshed-after-model-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> objects assigned to model fields are refreshed from the database on\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> on backends that support it without incurring a subsequent\nquery (SQLite, PostgreSQL, and Oracle) and deferred otherwise (MySQL or\nMariaDB). For 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>reporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reporter<span class=\"o\">.</span>stories_filed <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reporter<span class=\"o\">.</span>stories_filed  <span class=\"c1\"># This triggers a refresh query on MySQL/MariaDB.</span>\n<span class=\"go\">14  # Assuming the database value was 13 when the object was saved.</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>In previous versions of Django, <code class=\"docutils literal notranslate\">F()</code> objects were not refreshed from the\ndatabase on <a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> which resulted in them being evaluated and\npersisted every time the instance was saved.</p>\n</aside>\n</section>\n<section id=\"using-f-in-filters\">\n<h4>Använda <code class=\"docutils literal notranslate\">F()</code> i filter<a class=\"heading-anchor\" href=\"#using-f-in-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> är också mycket användbart i <code class=\"docutils literal notranslate\">QuerySet</code>-filter, där de gör det möjligt att filtrera en uppsättning objekt mot kriterier baserade på deras fältvärden, snarare än på Python-värden.</p>\n<p>Detta finns dokumenterat i <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/#using-f-expressions-in-filters\"><span class=\"std std-ref\">Använda F()-uttryck i frågor</span></a>.</p>\n</section>\n<section id=\"using-f-with-annotations\">\n<span id=\"id3\"></span><h4>Använda <code class=\"docutils literal notranslate\">F()</code> med annotationer<a class=\"heading-anchor\" href=\"#using-f-with-annotations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> kan användas för att skapa dynamiska fält i dina modeller genom att kombinera olika fält med aritmetik:</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>company <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>chairs_needed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">-</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Om de fält som du kombinerar är av olika typer måste du tala om för Django vilken typ av fält som ska returneras. De flesta uttryck stöder <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> för detta fall, men eftersom <code class=\"docutils literal notranslate\">F()</code> inte gör det, måste du omsluta uttrycket med <a class=\"reference internal\" href=\"#django.db.models.ExpressionWrapper\" title=\"django.db.models.ExpressionWrapper\"><code class=\"xref py py-class docutils literal notranslate\">ExpressionWrapper</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> DateTimeField<span class=\"p\">,</span> ExpressionWrapper<span class=\"p\">,</span> F\n\nTicket<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n    expires<span class=\"o\">=</span>ExpressionWrapper<span class=\"p\">(</span>\n        F<span class=\"p\">(</span><span class=\"s2\">&quot;active_at&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;duration&quot;</span><span class=\"p\">),</span> output_field<span class=\"o\">=</span>DateTimeField<span class=\"p\">()</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Vid hänvisning till relationsfält som <code class=\"docutils literal notranslate\">ForeignKey</code> returnerar <code class=\"docutils literal notranslate\">F()</code> primärnyckelvärdet i stället för en modellinstans:</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>car <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>built_by<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;manufacturer&quot;</span><span class=\"p\">))[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>car<span class=\"o\">.</span>manufacturer\n<span class=\"go\">&lt;Manufacturer: Toyota&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>car<span class=\"o\">.</span>built_by\n<span class=\"go\">3</span>\n</code></pre></div>\n</section>\n<section id=\"using-f-to-sort-null-values\">\n<span id=\"id4\"></span><h4>Använda <code class=\"docutils literal notranslate\">F()</code> för att sortera nollvärden<a class=\"heading-anchor\" href=\"#using-f-to-sort-null-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Använd <code class=\"docutils literal notranslate\">F()</code> och nyckelordsargumentet <code class=\"docutils literal notranslate\">nulls_first</code> eller <code class=\"docutils literal notranslate\">nulls_last</code> till <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">Expression.asc()</code></a> eller <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a> för att styra ordningsföljden för ett fälts null-värden. Som standard beror ordningsföljden på din databas.</p>\n<p>Till exempel:, för att sortera företag som inte har kontaktats (<code class=\"docutils literal notranslate\">last_contacted</code> är null) efter företag som har kontaktats:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;last_contacted&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">(</span>nulls_last<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"using-f-with-logical-operations\">\n<h4>Använda <code class=\"docutils literal notranslate\">F()</code> med logiska operationer<a class=\"heading-anchor\" href=\"#using-f-with-logical-operations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code>-uttryck som ger <code class=\"docutils literal notranslate\">BooleanField</code> kan logiskt negeras med inversionsoperatorn <code class=\"docutils literal notranslate\">~F()</code>. Till exempel:, för att byta aktiveringsstatus för företag:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>is_active<span class=\"o\">=~</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;is_active&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"func-expressions\">\n<span id=\"id5\"></span><h3><code class=\"docutils literal notranslate\">Func()</code> uttryck<a class=\"heading-anchor\" href=\"#func-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">Func()</code>-uttryck är bastypen för alla uttryck som involverar databasfunktioner som <code class=\"docutils literal notranslate\">COALESCE</code> och <code class=\"docutils literal notranslate\">LOWER</code>, eller aggregat som <code class=\"docutils literal notranslate\">SUM</code>. De kan användas direkt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Func\n\nqueryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>field_lower<span class=\"o\">=</span>Func<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;field&quot;</span><span class=\"p\">),</span> function<span class=\"o\">=</span><span class=\"s2\">&quot;LOWER&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>eller så kan de användas för att bygga upp ett bibliotek med databasfunktioner:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Lower</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;LOWER&quot;</span>\n\n\nqueryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>field_lower<span class=\"o\">=</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;field&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Men båda fallen kommer att resultera i en frågeuppsättning där varje modell är annoterad med ett extra attribut <code class=\"docutils literal notranslate\">field_lower</code> som produceras, ungefär, från följande SQL:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">SELECT</span>\n    <span class=\"p\">...</span>\n    <span class=\"k\">LOWER</span><span class=\"p\">(</span><span class=\"ss\">&quot;db_table&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;field&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"ss\">&quot;field_lower&quot;</span>\n</code></pre></div>\n<p>See <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/\"><span class=\"doc\">Databasfunktioner</span></a> for a list of built-in database\nfunctions.</p>\n<p>API:et <code class=\"docutils literal notranslate\">Func</code> är uppbyggt enligt följande:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Func</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.function\">\n<span class=\"sig-name descname\">function</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.function\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut som beskriver den funktion som ska genereras. Specifikt kommer <code class=\"docutils literal notranslate\">funktionen</code> att interpoleras som <code class=\"docutils literal notranslate\">funktion</code> platshållare inom <a class=\"reference internal\" href=\"#django.db.models.Func.template\" title=\"django.db.models.Func.template\"><code class=\"xref py py-attr docutils literal notranslate\">template</code></a>. Standardvärdet är <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut, i form av en formatsträng, som beskriver den SQL som genereras för denna funktion. Standardvärdet är <code class=\"docutils literal notranslate\">'%(function)s(%(expressions)s)'</code>.</p>\n<p>Om du konstruerar SQL som <code class=\"docutils literal notranslate\">strftime('%W', 'date')</code> och behöver ett bokstavligt <code class=\"docutils literal notranslate\">%</code>-tecken i frågan, fyrdubblar du det (<code class=\"docutils literal notranslate\">%%%%</code>) i attributet <code class=\"docutils literal notranslate\">template</code> eftersom strängen interpoleras två gånger: en gång under mallinterpolationen i <code class=\"docutils literal notranslate\">as_sql()</code> och en gång i SQL-interpolationen med frågeparametrarna i databasmarkören.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.arg_joiner\">\n<span class=\"sig-name descname\">arg_joiner</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.arg_joiner\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut som anger det tecken som används för att sammanfoga listan med <code class=\"docutils literal notranslate\">uttryck</code>. Standardvärden är <code class=\"docutils literal notranslate\">', '</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.arity\">\n<span class=\"sig-name descname\">arity</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.arity\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut som anger antalet argument som funktionen accepterar. Om detta attribut är inställt och funktionen anropas med ett annat antal uttryck, kommer <code class=\"docutils literal notranslate\">TypeError</code> att uppstå. Standardvärde är <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.as_sql\">\n<span class=\"sig-name descname\">as_sql</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">compiler</em>, <em class=\"sig-param\">connection</em>, <em class=\"sig-param\">function<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">template<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">arg_joiner<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra_context</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.as_sql\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Genererar SQL-fragmentet för databasfunktionen. Returnerar en tupel <code class=\"docutils literal notranslate\">(sql, params)</code>, där <code class=\"docutils literal notranslate\">sql</code> är SQL-strängen och <code class=\"docutils literal notranslate\">params</code> är listan eller tupeln med frågeparametrar.</p>\n<p>Metoderna <code class=\"docutils literal notranslate\">as_vendor()</code> bör använda parametrarna <code class=\"docutils literal notranslate\">function</code>, <code class=\"docutils literal notranslate\">template</code>, <code class=\"docutils literal notranslate\">arg_joiner</code> och alla andra <code class=\"docutils literal notranslate\">**extra_context</code> för att anpassa SQL efter behov. Ett exempel:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django/db/modeller/functions.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">ConcatPair</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;CONCAT&quot;</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">as_mysql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> <span class=\"o\">**</span>extra_context<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>\n            compiler<span class=\"p\">,</span>\n            connection<span class=\"p\">,</span>\n            function<span class=\"o\">=</span><span class=\"s2\">&quot;CONCAT_WS&quot;</span><span class=\"p\">,</span>\n            template<span class=\"o\">=</span><span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(&#39;&#39;, </span><span class=\"si\">%(expressions)s</span><span class=\"s2\">)&quot;</span><span class=\"p\">,</span>\n            <span class=\"o\">**</span>extra_context\n        <span class=\"p\">)</span>\n</code></pre></figure>\n<p>För att undvika en SQL-injektionssårbarhet får <code class=\"docutils literal notranslate\">extra_context</code> <a class=\"reference internal\" href=\"#avoiding-sql-injection-in-query-expressions\"><span class=\"std std-ref\">inte innehålla otillförlitlig användarinmatning</span></a> eftersom dessa värden interpoleras in i SQL-strängen i stället för att skickas som frågeparametrar, där databasdrivrutinen skulle undkomma dem.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Argumentet <code class=\"docutils literal notranslate\">*expressions</code> är en lista med positionella uttryck som funktionen ska tillämpas på. Uttrycken konverteras till strängar, sammanfogas med <code class=\"docutils literal notranslate\">arg_joiner</code> och interpoleras sedan in i <code class=\"docutils literal notranslate\">mallen</code> som platshållaren <code class=\"docutils literal notranslate\">expressions</code>.</p>\n<p>Positionella argument kan vara uttryck eller Python-värden. Strängar antas vara kolumnreferenser och kommer att packas in i <code class=\"docutils literal notranslate\">F()</code> uttryck medan andra värden kommer att packas in i <code class=\"docutils literal notranslate\">Value()</code> uttryck.</p>\n<p>De <code class=\"docutils literal notranslate\">**extra</code> kwargs är <code class=\"docutils literal notranslate\">key=value</code> par som kan interpoleras in i <code class=\"docutils literal notranslate\">template</code> attributet. För att undvika en SQL-injektionssårbarhet, <code class=\"docutils literal notranslate\">extra</code> <a class=\"reference internal\" href=\"#avoiding-sql-injection-in-query-expressions\"><span class=\"std std-ref\">får inte innehålla otillförlitlig användarinmatning</span></a> eftersom dessa värden interpoleras in i SQL-strängen i stället för att skickas som frågeparametrar, där databasdrivrutinen skulle undkomma dem.</p>\n<p>Nyckelorden <code class=\"docutils literal notranslate\">function</code>, <code class=\"docutils literal notranslate\">template</code> och <code class=\"docutils literal notranslate\">arg_joiner</code> kan användas för att ersätta attribut med samma namn utan att behöva definiera en egen klass. <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> kan användas för att definiera den förväntade returtypen.</p>\n<aside class=\"admonition-sanitize-input-used-to-configure-a-query-expression admonition\" role=\"note\">\n<p class=\"admonition-title\">Sanitize input used to configure a query expression</p>\n<p>Built-in database functions (such as\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#django.db.models.functions.Cast\" title=\"django.db.models.functions.Cast\"><code class=\"xref py py-class docutils literal notranslate\">Cast</code></a>) vary in whether arguments such\nas <code class=\"docutils literal notranslate\">output_field</code> can be supplied positionally or only by keyword. For\n<code class=\"docutils literal notranslate\">output_field</code> and several other cases, the input ultimately reaches\n<code class=\"docutils literal notranslate\">Func()</code> as a keyword argument, so the advice to avoid constructing\nkeyword arguments from untrusted user input applies as equally to these\narguments as it does to <code class=\"docutils literal notranslate\">**extra</code>.</p>\n</aside>\n</section>\n<section id=\"aggregate-expressions\">\n<h3>uttryck för <code class=\"docutils literal notranslate\">Aggregate()</code><a class=\"heading-anchor\" href=\"#aggregate-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ett aggregatuttryck är ett specialfall av ett <a class=\"reference internal\" href=\"#func-expressions\"><span class=\"std std-ref\">Func()-uttryck</span></a> som informerar frågan om att en <code class=\"docutils literal notranslate\">GROUP BY</code>-klausul krävs. Alla <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">aggregate-funktioner</span></a>, som <code class=\"docutils literal notranslate\">Sum()</code> och <code class=\"docutils literal notranslate\">Count()</code>, ärver från <code class=\"docutils literal notranslate\">Aggregate()</code>.</p>\n<p>Eftersom <code class=\"docutils literal notranslate\">Aggregate</code> är uttryck och omslagsuttryck kan du representera vissa komplexa beräkningar:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n    managers_required<span class=\"o\">=</span><span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">4</span><span class=\"p\">)</span> <span class=\"o\">+</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;num_managers&quot;</span><span class=\"p\">)</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>API:et för <code class=\"docutils literal notranslate\">Aggregate</code> är som följer:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Aggregate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">distinct<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">filter<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">default<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">order_by<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut, i form av en formatsträng, som beskriver den SQL som genereras för detta aggregat. Standardvärdet är <code class=\"docutils literal notranslate\">'%(function)s(%(distinct)s%(expressions)s)'</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.function\">\n<span class=\"sig-name descname\">function</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.function\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut som beskriver den aggregerade funktion som ska genereras. Specifikt kommer <code class=\"docutils literal notranslate\">funktionen</code> att interpoleras som <code class=\"docutils literal notranslate\">funktion</code> platshållare inom <a class=\"reference internal\" href=\"#django.db.models.Aggregate.template\" title=\"django.db.models.Aggregate.template\"><code class=\"xref py py-attr docutils literal notranslate\">template</code></a>. Standardvärdet är <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.window_compatible\">\n<span class=\"sig-name descname\">window_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.window_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Standardvärdet är <code class=\"docutils literal notranslate\">True</code> eftersom de flesta aggregerade funktioner kan användas som källuttryck i <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.allow_distinct\">\n<span class=\"sig-name descname\">allow_distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.allow_distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ett klassattribut som avgör om denna aggregatfunktion tillåter att ett argument med nyckelordet <code class=\"docutils literal notranslate\">distinct</code> skickas eller inte. Om det är satt till <code class=\"docutils literal notranslate\">False</code> (standard), kommer <code class=\"docutils literal notranslate\">TypeError</code> att uppstå om <code class=\"docutils literal notranslate\">distinct=True</code> skickas.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.allow_order_by\">\n<span class=\"sig-name descname\">allow_order_by</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.allow_order_by\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p>A class attribute determining whether or not this aggregate function\nallows passing a <code class=\"docutils literal notranslate\">order_by</code> keyword argument. If set to <code class=\"docutils literal notranslate\">False</code>\n(default), <code class=\"docutils literal notranslate\">TypeError</code> is raised if <code class=\"docutils literal notranslate\">order_by</code> is passed as a value\nother than <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.empty_result_set_value\">\n<span class=\"sig-name descname\">empty_result_set_value</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.empty_result_set_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Standardvärdet är <code class=\"docutils literal notranslate\">None</code> eftersom de flesta aggregeringsfunktioner resulterar i <code class=\"docutils literal notranslate\">NULL</code> när de tillämpas på en tom resultatmängd.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>De positionella argumenten <code class=\"docutils literal notranslate\">expressions</code> kan innehålla uttryck, transformationer av modellfältet eller namn på modellfält. De konverteras till en sträng och används som platshållare för <code class=\"docutils literal notranslate\">expressions</code> i <code class=\"docutils literal notranslate\">template</code>.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">distinct</code> avgör om aggregatfunktionen ska anropas för varje distinkt värde i <code class=\"docutils literal notranslate\">expressions</code> (eller uppsättning värden, för flera <code class=\"docutils literal notranslate\">expressions</code>). Argumentet stöds endast av aggregat som har <a class=\"reference internal\" href=\"#django.db.models.Aggregate.allow_distinct\" title=\"django.db.models.Aggregate.allow_distinct\"><code class=\"xref py py-attr docutils literal notranslate\">allow_distinct</code></a> satt till <code class=\"docutils literal notranslate\">True</code>.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">filter</code> tar ett <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q-objekt</code></a> som används för att filtrera de rader som aggregeras. Se <a class=\"reference internal\" href=\"/sv/6.0/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">Villkorlig aggregering</span></a> och <a class=\"reference internal\" href=\"/sv/6.0/topics/db/aggregation/#filtering-on-annotations\"><span class=\"std std-ref\">Filtrering av anteckningar</span></a> för exempel på användning.</p>\n<p>The <code class=\"docutils literal notranslate\">order_by</code> argument behaves similarly to the <code class=\"docutils literal notranslate\">field_names</code> input of the\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> function, accepting a field name (with an optional\n<code class=\"docutils literal notranslate\">&quot;-&quot;</code> prefix which indicates descending order) or an expression (or a tuple\nor list of strings and/or expressions) that specifies the ordering of the\nelements in the result.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">default</code> tar ett värde som kommer att skickas tillsammans med aggregatet till <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#django.db.models.functions.Coalesce\" title=\"django.db.models.functions.Coalesce\"><code class=\"xref py py-class docutils literal notranslate\">Coalesce</code></a>. Detta är användbart för att ange ett annat värde som ska returneras än <code class=\"docutils literal notranslate\">None</code> när frågeuppsättningen (eller grupperingen) inte innehåller några poster.</p>\n<p>De <code class=\"docutils literal notranslate\">**extra</code> kwargs är <code class=\"docutils literal notranslate\">nyckel=värde</code>-par som kan interpoleras in i <code class=\"docutils literal notranslate\">template</code>-attributet.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>The <code class=\"docutils literal notranslate\">order_by</code> argument was added.</p>\n</aside>\n</section>\n<section id=\"creating-your-own-aggregate-functions\">\n<h3>Skapa dina egna aggregerade funktioner<a class=\"heading-anchor\" href=\"#creating-your-own-aggregate-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan också skapa dina egna aggregerade funktioner. Som ett minimum måste du definiera <code class=\"docutils literal notranslate\">function</code>, men du kan också helt anpassa den SQL som genereras. Här är ett kort exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Aggregate\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Sum</span><span class=\"p\">(</span>Aggregate<span class=\"p\">):</span>\n    <span class=\"c1\"># Supports SUM(ALL field).</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;SUM&quot;</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(</span><span class=\"si\">%(all_values)s%(expressions)s</span><span class=\"s2\">)&quot;</span>\n    allow_distinct <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    arity <span class=\"o\">=</span> <span class=\"mi\">1</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> all_values<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"o\">**</span>extra<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> all_values<span class=\"o\">=</span><span class=\"s2\">&quot;ALL &quot;</span> <span class=\"k\">if</span> all_values <span class=\"k\">else</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"o\">**</span>extra<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"value-expressions\">\n<h3>uttryck för <code class=\"docutils literal notranslate\">Value()</code><a class=\"heading-anchor\" href=\"#value-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Value\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Value</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ett <code class=\"docutils literal notranslate\">Value()</code>-objekt representerar den minsta möjliga komponenten i ett uttryck: ett enkelt värde. När du behöver representera värdet av ett heltal, en boolean eller en sträng i ett uttryck, kan du packa in värdet i ett <code class=\"docutils literal notranslate\">Value()</code>.</p>\n<p>Du kommer sällan att behöva använda <code class=\"docutils literal notranslate\">Value()</code> direkt. När du skriver uttrycket <code class=\"docutils literal notranslate\">F('field') + 1</code> omsluter Django implicit <code class=\"docutils literal notranslate\">1</code> i en <code class=\"docutils literal notranslate\">Value()</code>, vilket gör att enkla värden kan användas i mer komplexa uttryck. Du kommer att behöva använda <code class=\"docutils literal notranslate\">Value()</code> när du vill skicka en sträng till ett uttryck. De flesta uttryck tolkar ett strängargument som namnet på ett fält, t.ex. <code class=\"docutils literal notranslate\">Lower('name')</code>.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">value</code> beskriver det värde som ska ingå i uttrycket, t.ex. <code class=\"docutils literal notranslate\">1</code>, <code class=\"docutils literal notranslate\">True</code> eller <code class=\"docutils literal notranslate\">None</code>. Django vet hur man konverterar dessa Python-värden till deras motsvarande databastyp.</p>\n<p>If no <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> is specified, it will be inferred from\nthe type of the provided <code class=\"docutils literal notranslate\">value</code> for many common types. For example, passing\nan instance of <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.datetime</code></a> as <code class=\"docutils literal notranslate\">value</code> defaults\n<code class=\"docutils literal notranslate\">output_field</code> to <a class=\"reference internal\" href=\"/sv/6.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>.</p>\n</section>\n<section id=\"expressionwrapper-expressions\">\n<h3><code class=\"docutils literal notranslate\">ExpressionWrapper()</code> uttryck<a class=\"heading-anchor\" href=\"#expressionwrapper-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.ExpressionWrapper\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ExpressionWrapper</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.ExpressionWrapper\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ExpressionWrapper</code> omger ett annat uttryck och ger tillgång till egenskaper, t.ex. <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a>, som kanske inte är tillgängliga för andra uttryck. <code class=\"docutils literal notranslate\">ExpressionWrapper</code> är nödvändig när man använder aritmetik på <code class=\"docutils literal notranslate\">F()</code>-uttryck med olika typer enligt beskrivningen i <a class=\"reference internal\" href=\"#using-f-with-annotations\"><span class=\"std std-ref\">Använda F() med annotationer</span></a>.</p>\n<aside class=\"admonition-database-casting-not-performed admonition\" role=\"note\">\n<p class=\"admonition-title\">Database casting not performed</p>\n<p><code class=\"docutils literal notranslate\">ExpressionWrapper</code> only sets the output field for the ORM and does not\nperform any database-level casting. To ensure a specific type is returned\nfrom the database, use <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#django.db.models.functions.Cast\" title=\"django.db.models.functions.Cast\"><code class=\"xref py py-class docutils literal notranslate\">Cast</code></a> instead.</p>\n</aside>\n</section>\n<section id=\"conditional-expressions\">\n<h3>Villkorliga uttryck<a class=\"heading-anchor\" href=\"#conditional-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Conditional expressions allow you to use <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">if</code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">elif</code></a> …\n<a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">else</code></a> logic in queries. Django natively supports SQL <code class=\"docutils literal notranslate\">CASE</code>\nexpressions. For more details see <a class=\"reference internal\" href=\"/sv/6.0/ref/models/conditional-expressions/\"><span class=\"doc\">Villkorliga uttryck</span></a>.</p>\n</section>\n<section id=\"subquery-expressions\">\n<h3>uttryck för <code class=\"docutils literal notranslate\">Subquery()</code><a class=\"heading-anchor\" href=\"#subquery-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Subquery\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Subquery</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">queryset</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Subquery\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Du kan lägga till en explicit underfråga till en <code class=\"docutils literal notranslate\">QuerySet</code> med hjälp av uttrycket <code class=\"docutils literal notranslate\">Subquery</code>.</p>\n<p>Till exempel: för att kommentera varje inlägg med e-postadressen till författaren till den nyaste kommentaren till det inlägget:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> OuterRef<span class=\"p\">,</span> Subquery\n<span class=\"gp\">&gt;&gt;&gt; </span>newest <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-created_at&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>newest_commenter_email<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>newest<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">1</span><span class=\"p\">]))</span>\n</code></pre></div>\n<p>På PostgreSQL ser SQL ut som:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>\n    <span class=\"k\">SELECT</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;email&quot;</span>\n    <span class=\"k\">FROM</span> <span class=\"ss\">&quot;comment&quot;</span> U0\n    <span class=\"k\">WHERE</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;post_id&quot;</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">ORDER</span> <span class=\"k\">BY</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;created_at&quot;</span> <span class=\"k\">DESC</span> <span class=\"k\">LIMIT</span> <span class=\"mi\">1</span>\n<span class=\"p\">)</span> <span class=\"k\">AS</span> <span class=\"ss\">&quot;newest_commenter_email&quot;</span> <span class=\"k\">FROM</span> <span class=\"ss\">&quot;post&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Exemplen i detta avsnitt är utformade för att visa hur man tvingar Django att utföra en underfråga. I vissa fall kan det vara möjligt att skriva ett likvärdigt queryset som utför samma uppgift tydligare eller effektivare.</p>\n</aside>\n<section id=\"referencing-columns-from-the-outer-queryset\">\n<h4>Hänvisning till kolumner från den yttre queryset<a class=\"heading-anchor\" href=\"#referencing-columns-from-the-outer-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.OuterRef\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">OuterRef</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.OuterRef\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Använd <code class=\"docutils literal notranslate\">OuterRef</code> när en queryset i en <code class=\"docutils literal notranslate\">Subquery</code> behöver referera till ett fält från den yttre queryn eller dess transform. Det fungerar som ett <a class=\"reference internal\" href=\"#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\">F</code></a>-uttryck förutom att kontrollen för att se om det hänvisar till ett giltigt fält inte görs förrän den yttre frågeuppsättningen har lösts upp.</p>\n<p>Instanser av <code class=\"docutils literal notranslate\">OuterRef</code> kan användas tillsammans med nästlade instanser av <code class=\"docutils literal notranslate\">Subquery</code> för att hänvisa till en innehållande frågeuppsättning som inte är den omedelbara föräldern. Till exempel: skulle denna frågeuppsättning behöva vara inom ett nästlat par av <code class=\"docutils literal notranslate\">Subquery</code>-instanser för att lösas korrekt:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>author<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)))</span>\n</code></pre></div>\n</section>\n<section id=\"limiting-a-subquery-to-a-single-column\">\n<h4>Begränsa en underfrågeställning till en enda kolumn<a class=\"heading-anchor\" href=\"#limiting-a-subquery-to-a-single-column\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Det finns tillfällen då en enda kolumn måste returneras från en <code class=\"docutils literal notranslate\">Subquery</code>, t.ex. för att använda en <code class=\"docutils literal notranslate\">Subquery</code> som mål för en <code class=\"docutils literal notranslate\">__in</code>-uppslagning. För att returnera alla kommentarer för inlägg som publicerats under den senaste dagen:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> timedelta\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>one_day_ago <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>posts <span class=\"o\">=</span> Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>published_at__gte<span class=\"o\">=</span>one_day_ago<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post__in<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>posts<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>I det här fallet måste underfrågan använda <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a> för att bara returnera en enda kolumn: inläggets primärnyckel.</p>\n</section>\n<section id=\"limiting-the-subquery-to-a-single-row\">\n<h4>Begränsa underfrågeställningen till en enda rad<a class=\"heading-anchor\" href=\"#limiting-the-subquery-to-a-single-row\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>För att förhindra att en underfråga returnerar flera rader används en del (<code class=\"docutils literal notranslate\">[:1]</code>) av frågeuppsättningen:</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>subquery <span class=\"o\">=</span> Subquery<span class=\"p\">(</span>newest<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>newest_commenter_email<span class=\"o\">=</span>subquery<span class=\"p\">)</span>\n</code></pre></div>\n<p>I det här fallet får subquery bara returnera en enda kolumn <em>och</em> en enda rad: e-postadressen till den senast skapade kommentaren.</p>\n<p>(Att använda <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> istället för en slice skulle misslyckas eftersom <code class=\"docutils literal notranslate\">OuterRef</code> inte kan lösas förrän queryset används inom en <code class=\"docutils literal notranslate\">Subquery</code>)</p>\n</section>\n<section id=\"exists-subqueries\">\n<h4><code class=\"docutils literal notranslate\">Existerar()</code> underfrågor<a class=\"heading-anchor\" href=\"#exists-subqueries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Exists\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Exists</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">queryset</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Exists\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">Exists</code> är en <code class=\"docutils literal notranslate\">Subquery</code>-underklass som använder en SQL <code class=\"docutils literal notranslate\">EXISTS</code>-sats. I många fall kommer den att fungera bättre än en subquery eftersom databasen kan stoppa utvärderingen av subquery när en första matchande rad hittas.</p>\n<p>Till exempel: för att markera varje inlägg med om det har en kommentar från den senaste dagen eller inte:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Exists<span class=\"p\">,</span> OuterRef\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> timedelta\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>one_day_ago <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>recent_comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    created_at__gte<span class=\"o\">=</span>one_day_ago<span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>recent_comment<span class=\"o\">=</span>Exists<span class=\"p\">(</span>recent_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>På PostgreSQL ser SQL ut som:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;published_at&quot;</span><span class=\"p\">,</span> <span class=\"k\">EXISTS</span><span class=\"p\">(</span>\n    <span class=\"k\">SELECT</span> <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"ss\">&quot;a&quot;</span>\n    <span class=\"k\">FROM</span> <span class=\"ss\">&quot;comment&quot;</span> U0\n    <span class=\"k\">WHERE</span> <span class=\"p\">(</span>\n        U0<span class=\"p\">.</span><span class=\"ss\">&quot;created_at&quot;</span> <span class=\"o\">&gt;=</span> YYYY<span class=\"o\">-</span>MM<span class=\"o\">-</span>DD HH<span class=\"p\">:</span>MM<span class=\"p\">:</span>SS <span class=\"k\">AND</span>\n        U0<span class=\"p\">.</span><span class=\"ss\">&quot;post_id&quot;</span> <span class=\"o\">=</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">LIMIT</span> <span class=\"mi\">1</span>\n<span class=\"p\">)</span> <span class=\"k\">AS</span> <span class=\"ss\">&quot;recent_comment&quot;</span> <span class=\"k\">FROM</span> <span class=\"ss\">&quot;post&quot;</span>\n</code></pre></div>\n<p>Det är onödigt att tvinga <code class=\"docutils literal notranslate\">Exists</code> att hänvisa till en enda kolumn, eftersom kolumnerna kasseras och ett booleskt resultat returneras. På samma sätt, eftersom ordning är oviktigt inom en SQL <code class=\"docutils literal notranslate\">EXISTS</code> subquery och bara skulle försämra prestanda, tas det automatiskt bort.</p>\n<p>Du kan ställa frågor med hjälp av <code class=\"docutils literal notranslate\">NOT EXISTS</code> med <code class=\"docutils literal notranslate\">~Exists()</code>.</p>\n</section>\n<section id=\"filtering-on-a-subquery-or-exists-expressions\">\n<h4>Filtrering på ett <code class=\"docutils literal notranslate\">Subquery()</code>- eller <code class=\"docutils literal notranslate\">Exists()</code>-uttryck<a class=\"heading-anchor\" href=\"#filtering-on-a-subquery-or-exists-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">Subquery()</code> som returnerar ett booleskt värde och <code class=\"docutils literal notranslate\">Exists()</code> kan användas som ett <code class=\"docutils literal notranslate\">villkor</code> i <a class=\"reference internal\" href=\"/sv/6.0/ref/models/conditional-expressions/#django.db.models.expressions.When\" title=\"django.db.models.expressions.When\"><code class=\"xref py py-class docutils literal notranslate\">When</code></a>-uttryck, eller för att direkt filtrera en frågeuppsättning:</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>recent_comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>  <span class=\"c1\"># From above</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>Exists<span class=\"p\">(</span>recent_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>Detta säkerställer att subquery inte läggs till i <code class=\"docutils literal notranslate\">SELECT</code>-kolumnerna, vilket kan leda till bättre prestanda.</p>\n</section>\n<section id=\"using-aggregates-within-a-subquery-expression\">\n<h4>Använda aggregat inom ett <code class=\"docutils literal notranslate\">Subquery</code>-uttryck<a class=\"heading-anchor\" href=\"#using-aggregates-within-a-subquery-expression\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Aggregat kan användas i en <code class=\"docutils literal notranslate\">Subquery</code>, men de kräver en specifik kombination av <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a> och <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\">annotate()</code></a> för att grupperingen av subquery ska bli korrekt.</p>\n<p>Förutsatt att båda modellerna har ett <code class=\"docutils literal notranslate\">längd</code>-fält, för att hitta inlägg där inläggslängden är större än den totala längden på alla kombinerade kommentarer:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> OuterRef<span class=\"p\">,</span> Subquery<span class=\"p\">,</span> Sum\n<span class=\"gp\">&gt;&gt;&gt; </span>comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">()</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;post&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>total_comments <span class=\"o\">=</span> comments<span class=\"o\">.</span>annotate<span class=\"p\">(</span>total<span class=\"o\">=</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;length&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;total&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>length__gt<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>total_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>Den inledande <code class=\"docutils literal notranslate\">filter(...)</code> begränsar underfrågan till de relevanta parametrarna. <code class=\"docutils literal notranslate\">order_by()</code> tar bort standard <a class=\"reference internal\" href=\"/sv/6.0/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a> (om någon) på <code class=\"docutils literal notranslate\">Comment</code>-modellen. <code class=\"docutils literal notranslate\">values('post')</code> aggregerar kommentarer efter <code class=\"docutils literal notranslate\">Post</code>. Slutligen utför <code class=\"docutils literal notranslate\">annotate(...)</code> aggregeringen. Den ordning i vilken dessa queryset-metoder tillämpas är viktig. I det här fallet, eftersom underfrågan måste begränsas till en enda kolumn, krävs <code class=\"docutils literal notranslate\">values('total')</code>.</p>\n<p>Detta är det enda sättet att utföra en aggregering inom en <code class=\"docutils literal notranslate\">Subquery</code>, eftersom användning av <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\">aggregate()</code></a> försöker utvärdera queryset (och om det finns en <code class=\"docutils literal notranslate\">OuterRef</code> kommer detta inte att vara möjligt att lösa).</p>\n</section>\n</section>\n<section id=\"raw-sql-expressions\">\n<h3>Råa SQL-uttryck<a class=\"heading-anchor\" href=\"#raw-sql-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RawSQL\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RawSQL</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sql</em>, <em class=\"sig-param\">params</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RawSQL\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ibland kan databasuttryck inte enkelt uttrycka en komplex <code class=\"docutils literal notranslate\">WHERE</code> klausul. I dessa kantfall använder du <code class=\"docutils literal notranslate\">RawSQL</code> -uttrycket. Till exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.expressions</span> <span class=\"kn\">import</span> RawSQL\n<span class=\"gp\">&gt;&gt;&gt; </span>queryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>val<span class=\"o\">=</span>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>param<span class=\"p\">,)))</span>\n</code></pre></div>\n<p>Dessa extra uppslagningar kanske inte är portabla till olika databasmotorer (eftersom du uttryckligen skriver SQL-kod) och bryter mot DRY-principen, så du bör undvika dem om möjligt.</p>\n<p><code class=\"docutils literal notranslate\">RawSQL</code>-uttryck kan också användas som mål för <code class=\"docutils literal notranslate\">__in</code>-filter:</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>queryset<span class=\"o\">.</span>filter<span class=\"p\">(</span>id__in<span class=\"o\">=</span>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select id from sometable where col = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>param<span class=\"p\">,)))</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>För att skydda mot <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/SQL_injection\">SQL injection attacks</a>, måste du undkomma alla parametrar som användaren kan kontrollera genom att använda <code class=\"docutils literal notranslate\">params</code>. <code class=\"docutils literal notranslate\">params</code> är ett obligatoriskt argument för att tvinga dig att erkänna att du inte interpolerar din SQL med användartillhandahållna data.</p>\n<p>Du får inte heller använda citattecken för platshållare i SQL-strängen. Det här exemplet är sårbart för SQL-injektion på grund av citaten runt <code class=\"docutils literal notranslate\">%s</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = &#39;</span><span class=\"si\">%s</span><span class=\"s2\">&#39;&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># unsafe!</span>\n</code></pre></div>\n<p>Du kan läsa mer om hur Djangos <a class=\"reference internal\" href=\"/sv/6.0/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL injection protection</span></a> fungerar.</p>\n</aside>\n</section>\n<section id=\"window-functions\">\n<h3>Fönsterfunktioner<a class=\"heading-anchor\" href=\"#window-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Fönsterfunktioner är ett sätt att tillämpa funktioner på partitioner. Till skillnad från en vanlig aggregeringsfunktion som beräknar ett slutresultat för varje uppsättning som definieras av group by, arbetar fönsterfunktioner med <a class=\"reference internal\" href=\"#window-frames\"><span class=\"std std-ref\">ramar</span></a> och partitioner och beräknar resultatet för varje rad.</p>\n<p>Du kan ange flera fönster i samma fråga, vilket i Django ORM skulle motsvara att inkludera flera uttryck i ett <a class=\"reference internal\" href=\"/sv/6.0/topics/db/aggregation/\"><span class=\"doc\">QuerySet.annotate()</span></a>-anrop. ORM använder sig inte av namngivna fönster, utan de är en del av de valda kolumnerna.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.Window\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Window</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">partition_by<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">order_by<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">frame<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Window\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.Window.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Window.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Standardvärdet är <code class=\"docutils literal notranslate\">%(expression)s OVER (%(window)s)</code>. Om endast argumentet <code class=\"docutils literal notranslate\">expression</code> anges, kommer window-satsen att vara tom.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Klassen <code class=\"docutils literal notranslate\">Window</code> är huvuduttrycket för en <code class=\"docutils literal notranslate\">OVER</code>-sats.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">expression</code> är antingen en <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#window-functions\"><span class=\"std std-ref\">window function</span></a>, en <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">aggregate function</span></a>, eller ett uttryck som är kompatibelt i en window clause.</p>\n<p>The <code class=\"docutils literal notranslate\">partition_by</code> argument accepts an expression or a sequence of\nexpressions (column names should be wrapped in an <code class=\"docutils literal notranslate\">F</code>-object) that control\nthe partitioning of the rows. Partitioning narrows which rows are used to\ncompute the result set.</p>\n<p><a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> anges antingen som ett argument eller genom ett uttryck.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">order_by</code> accepterar ett uttryck som du kan anropa <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> och <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a>, en sträng med ett fältnamn (med ett valfritt prefix <code class=\"docutils literal notranslate\">&quot;-&quot;</code> som anger fallande ordning), eller en tupel eller lista med strängar och/eller uttryck. Ordningsföljden styr i vilken ordning uttrycket tillämpas. Om du t.ex. summerar över raderna i en partition är det första resultatet värdet på den första raden, det andra är summan av den första och den andra raden.</p>\n<p>The <code class=\"docutils literal notranslate\">frame</code> parameter specifies which other rows should be used in the\ncomputation. See <a class=\"reference internal\" href=\"#window-frames\"><span class=\"std std-ref\">Ramar</span></a> for details.</p>\n<p>Till exempel: för att kommentera varje film med det genomsnittliga betyget för filmer från samma studio i samma genre och utgivningsår:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Detta gör att du kan kontrollera om en film har fått bättre eller sämre betyg än sina konkurrenter.</p>\n<p>Du kanske vill använda flera uttryck över samma fönster, dvs. samma partition och ram. Du kan t.ex. ändra det föregående exemplet så att det även inkluderar det bästa och sämsta betyget i varje filmgrupp (samma studio, genre och utgivningsår) genom att använda tre fönsterfunktioner i samma fråga. Partitionen och ordningen från föregående exempel extraheras till en ordbok för att minska upprepning:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> Max<span class=\"p\">,</span> Min<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>window <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;partition_by&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;order_by&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    best<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    worst<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Filtrering mot fönsterfunktioner stöds så länge som uppslagningar inte är disjunktiva (inte använder <code class=\"docutils literal notranslate\">OR</code> eller <code class=\"docutils literal notranslate\">XOR</code> som en koppling) och mot en frågeuppsättning som utför aggregering.</p>\n<p>Exempelvis stöds inte en fråga som bygger på aggregering och som har ett filter med <code class=\"docutils literal notranslate\">OR</code> mot en fönsterfunktion och ett fält. Om kombinerade predikat tillämpas efter aggregering kan det leda till att rader som normalt inte ingår i grupper inkluderas:</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>qs <span class=\"o\">=</span> Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    category_rank<span class=\"o\">=</span>Window<span class=\"p\">(</span>Rank<span class=\"p\">(),</span> partition_by<span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">,</span> order_by<span class=\"o\">=</span><span class=\"s2\">&quot;-rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    scenes_count<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;actors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>Q<span class=\"p\">(</span>category_rank__lte<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>title__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Batman&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span>qs<span class=\"p\">)</span>\n<span class=\"go\">NotImplementedError: Heterogeneous disjunctive predicates against window functions</span>\n<span class=\"go\">are not implemented when performing conditional aggregation.</span>\n</code></pre></div>\n<p>Bland Djangos inbyggda databasbackends stöder MySQL, PostgreSQL och Oracle fönsteruttryck. Stödet för olika funktioner i fönsteruttryck varierar mellan de olika databaserna. Till exempel: kanske alternativen i <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> och <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a> inte stöds. Konsultera dokumentationen för din databas vid behov.</p>\n<section id=\"frames\">\n<span id=\"window-frames\"></span><h4>Ramar<a class=\"heading-anchor\" href=\"#frames\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>För en fönsterram kan du välja antingen en intervallbaserad sekvens av rader eller en vanlig sekvens av rader.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.ValueRange\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ValueRange</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">start<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">end<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">exclusion<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.ValueRange\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.ValueRange.frame_type\">\n<span class=\"sig-name descname\">frame_type</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.ValueRange.frame_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Detta attribut är inställt på <code class=\"docutils literal notranslate\">'RANGE'</code>.</p>\n</dd></dl>\n\n<p>PostgreSQL har begränsat stöd för <code class=\"docutils literal notranslate\">ValueRange</code> och stöder endast användning av standardstart- och slutpunkter, såsom <code class=\"docutils literal notranslate\">CURRENT ROW</code> och <code class=\"docutils literal notranslate\">UNBOUNDED FOLLOWING</code>.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RowRange\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RowRange</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">start<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">end<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">exclusion<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RowRange\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RowRange.frame_type\">\n<span class=\"sig-name descname\">frame_type</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RowRange.frame_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Detta attribut är inställt på <code class=\"docutils literal notranslate\">'ROWS'</code>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Båda klasserna returnerar SQL med mallen:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"o\">%</span><span class=\"p\">(</span>frame_type<span class=\"p\">)</span>s <span class=\"k\">BETWEEN</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">start</span><span class=\"p\">)</span>s <span class=\"k\">AND</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">end</span><span class=\"p\">)</span>s\n</code></pre></div>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">WindowFrameExclusion</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\">\n<span class=\"sig-name descname\">CURRENT_ROW</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.GROUP\">\n<span class=\"sig-name descname\">GROUP</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.GROUP\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.TIES\">\n<span class=\"sig-name descname\">TIES</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.TIES\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.NO_OTHERS\">\n<span class=\"sig-name descname\">NO_OTHERS</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.NO_OTHERS\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</dd></dl>\n\n<p>Med argumentet <code class=\"docutils literal notranslate\">exclusion</code> kan du utesluta rader (<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\" title=\"django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\"><code class=\"xref py py-attr docutils literal notranslate\">CURRENT_ROW</code></a>), grupper (<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.GROUP\" title=\"django.db.models.expressions.WindowFrameExclusion.GROUP\"><code class=\"xref py py-attr docutils literal notranslate\">GROUP</code></a>) och band (<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.TIES\" title=\"django.db.models.expressions.WindowFrameExclusion.TIES\"><code class=\"xref py py-attr docutils literal notranslate\">TIES</code></a>) från fönsterramarna i databaser som stöds:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"o\">%</span><span class=\"p\">(</span>frame_type<span class=\"p\">)</span>s <span class=\"k\">BETWEEN</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">start</span><span class=\"p\">)</span>s <span class=\"k\">AND</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">end</span><span class=\"p\">)</span>s EXCLUDE <span class=\"o\">%</span><span class=\"p\">(</span>exclusion<span class=\"p\">)</span>s\n</code></pre></div>\n<p>Ramar begränsar de rader som används för att beräkna resultatet. De flyttas från en viss startpunkt till en viss angiven slutpunkt. Ramar kan användas med eller utan partitioner, men det är ofta en bra idé att ange en ordning för fönstret för att säkerställa ett deterministiskt resultat. I en ram är en peer i en ram en rad med ett likvärdigt värde, eller alla rader om det inte finns någon ordningsbestämmelse.</p>\n<p>Standardstartpunkten för en ram är <code class=\"docutils literal notranslate\">UNBOUNDED PRECEDING</code>, vilket är den första raden i partitionen. Slutpunkten inkluderas alltid explicit i den SQL som genereras av ORM och är som standard <code class=\"docutils literal notranslate\">UNBOUNDED FOLLOWING</code>. Standardramen omfattar alla rader från partitionen till den sista raden i uppsättningen.</p>\n<p>De accepterade värdena för argumenten <code class=\"docutils literal notranslate\">start</code> och <code class=\"docutils literal notranslate\">end</code> är <code class=\"docutils literal notranslate\">None</code>, ett heltal eller noll. Ett negativt heltal för <code class=\"docutils literal notranslate\">start</code> resulterar i <code class=\"docutils literal notranslate\">N PRECEDING</code>, medan <code class=\"docutils literal notranslate\">None</code> ger <code class=\"docutils literal notranslate\">UNBOUNDED PRECEDING</code>. I läget <code class=\"docutils literal notranslate\">ROWS</code> kan ett positivt heltal användas för <code class=\"docutils literal notranslate\">start</code>, vilket resulterar i <code class=\"docutils literal notranslate\">N FOLLOWING</code>. Positiva heltal accepteras för <code class=\"docutils literal notranslate\">slut</code> och resulterar i <code class=\"docutils literal notranslate\">N FOLLOWING</code>. I läget <code class=\"docutils literal notranslate\">ROWS</code> kan ett negativt heltal användas för <code class=\"docutils literal notranslate\">end</code> vilket resulterar i <code class=\"docutils literal notranslate\">N PRECEDING</code>. För både <code class=\"docutils literal notranslate\">start</code> och <code class=\"docutils literal notranslate\">end</code> kommer noll att returnera <code class=\"docutils literal notranslate\">CURRENT ROW</code>.</p>\n<p>Det finns en skillnad i vad <code class=\"docutils literal notranslate\">CURRENT ROW</code> inkluderar. När det anges i läget <code class=\"docutils literal notranslate\">ROWS</code> börjar eller slutar ramen med den aktuella raden. När den anges i läget <code class=\"docutils literal notranslate\">RANGE</code> startar eller slutar ramen vid den första eller sista peer enligt orderklausulen. Således utvärderar <code class=\"docutils literal notranslate\">RANGE CURRENT ROW</code> uttrycket för rader som har samma värde som specificeras av ordningsföljden. Eftersom mallen innehåller både <code class=\"docutils literal notranslate\">start</code>- och <code class=\"docutils literal notranslate\">slut</code>-punkter kan detta uttryckas med:</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>ValueRange<span class=\"p\">(</span>start<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om en films ”jämlikar” beskrivs som filmer som släppts av samma studio i samma genre under samma år, kommenterar detta <code class=\"docutils literal notranslate\">RowRange</code>-exempel varje film med det genomsnittliga betyget för filmens två föregående och två efterföljande jämlikar:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> RowRange<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        frame<span class=\"o\">=</span>RowRange<span class=\"p\">(</span>start<span class=\"o\">=-</span><span class=\"mi\">2</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om databasen har stöd för det kan du ange start- och slutpunkter baserat på värden för ett uttryck i partitionen. Om fältet <code class=\"docutils literal notranslate\">released</code> i modellen <code class=\"docutils literal notranslate\">Movie</code> lagrar utgivningsmånaden för varje film, anger detta exempel på <code class=\"docutils literal notranslate\">ValueRange</code> för varje film det genomsnittliga betyget för andra filmer som släppts mellan tolv månader före och tolv månader efter varje film:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> ValueRange<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        frame<span class=\"o\">=</span>ValueRange<span class=\"p\">(</span>start<span class=\"o\">=-</span><span class=\"mi\">12</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"technical-information\">\n<h2>Teknisk information<a class=\"heading-anchor\" href=\"#technical-information\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nedan hittar du tekniska implementeringsdetaljer som kan vara användbara för biblioteksförfattare. Det tekniska API:et och exemplen nedan hjälper till att skapa generiska frågeuttryck som kan utöka den inbyggda funktionaliteten som Django tillhandahåller.</p>\n<section id=\"expression-api\">\n<h3>Uttryck API<a class=\"heading-anchor\" href=\"#expression-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Frågeuttryck implementerar <a class=\"reference internal\" href=\"/sv/6.0/ref/models/lookups/#query-expression\"><span class=\"std std-ref\">query expression API</span></a>, men exponerar också ett antal extra metoder och attribut som listas nedan. Alla frågeuttryck måste ärva från <code class=\"docutils literal notranslate\">Expression()</code> eller en relevant underklass.</p>\n<p>När ett frågeuttryck omsluter ett annat uttryck är det ansvarigt för att anropa lämpliga metoder för det omslutna uttrycket.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Expression</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.allowed_default\">\n<span class=\"sig-name descname\">allowed_default</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.allowed_default\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck kan användas i <a class=\"reference internal\" href=\"/sv/6.0/ref/models/fields/#django.db.models.Field.db_default\" title=\"django.db.models.Field.db_default\"><code class=\"xref py py-attr docutils literal notranslate\">Field.db_default</code></a>. Standardvärdet är <code class=\"docutils literal notranslate\">False</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.constraint_validation_compatible\">\n<span class=\"sig-name descname\">constraint_validation_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.constraint_validation_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck kan användas under en begränsningsvalidering. Uttryck med <code class=\"docutils literal notranslate\">constraint_validation_compatible</code> inställt på <code class=\"docutils literal notranslate\">False</code> får endast ha ett källuttryck. Standardvärdet är <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.contains_aggregate\">\n<span class=\"sig-name descname\">contains_aggregate</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.contains_aggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck innehåller ett aggregat och att en <code class=\"docutils literal notranslate\">GROUP BY</code>-klausul måste läggas till i frågan.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.contains_over_clause\">\n<span class=\"sig-name descname\">contains_over_clause</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.contains_over_clause\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck innehåller ett <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a>-uttryck. Det används till exempel för att inte tillåta fönsterfunktionsuttryck i frågor som modifierar data.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.filterable\">\n<span class=\"sig-name descname\">filterable</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.filterable\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck kan refereras till i <a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.filter()</code></a>. Standardvärdet är <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.window_compatible\">\n<span class=\"sig-name descname\">window_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.window_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Talar om för Django att detta uttryck kan användas som källuttryck i <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a>. Standardvärdet är <code class=\"docutils literal notranslate\">False</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.empty_result_set_value\">\n<span class=\"sig-name descname\">empty_result_set_value</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.empty_result_set_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Tells Django which value should be returned when the expression is used\nto apply a function over an empty result set. Defaults to\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/constants.html#NotImplemented\" title=\"(in Python v3.14)\"><code class=\"xref py py-data docutils literal notranslate\">NotImplemented</code></a> which forces the expression to be computed on\nthe database.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.set_returning\">\n<span class=\"sig-name descname\">set_returning</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.set_returning\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>Talar om för Django att detta uttryck innehåller en set-returneringsfunktion, vilket tvingar fram utvärdering av underfrågor. Det används t.ex. för att tillåta vissa Postgres set-returning-funktioner (t.ex. <code class=\"docutils literal notranslate\">JSONB_PATH_QUERY</code>, <code class=\"docutils literal notranslate\">UNNEST</code>, etc.) att hoppa över optimering och utvärderas korrekt när annotationer skapar rader själva. Standardvärde är <code class=\"docutils literal notranslate\">False</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.allows_composite_expressions\">\n<span class=\"sig-name descname\">allows_composite_expressions</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.allows_composite_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>Talar om för Django att detta uttryck tillåter sammansatta uttryck, till exempel för att stödja <a class=\"reference internal\" href=\"/sv/6.0/topics/composite-primary-key/#cpk-and-database-functions\"><span class=\"std std-ref\">sammansatta primärnycklar</span></a>. Standardvärdet är <code class=\"docutils literal notranslate\">False</code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.resolve_expression\">\n<span class=\"sig-name descname\">resolve_expression</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">query<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">allow_joins<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">reuse<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">summarize<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">for_save<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.resolve_expression\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ger möjlighet att göra förbehandling eller validering av uttrycket innan det läggs till i frågan. <code class=\"docutils literal notranslate\">resolve_expression()</code> måste också anropas på alla nästlade uttryck. En <code class=\"docutils literal notranslate\">copy()</code> av <code class=\"docutils literal notranslate\">self</code> bör returneras med alla nödvändiga transformationer.</p>\n<p><code class=\"docutils literal notranslate\">query</code> är implementeringen av backend-frågan.</p>\n<p><code class=\"docutils literal notranslate\">allow_joins</code> är en boolean som tillåter eller förnekar användning av joins i frågan.</p>\n<p><code class=\"docutils literal notranslate\">reuse</code> är en uppsättning återanvändbara joins för scenarier med flera joins.</p>\n<p><code class=\"docutils literal notranslate\">summarize</code> är en boolean som, när den är <code class=\"docutils literal notranslate\">True</code>, signalerar att den fråga som beräknas är en terminal aggregerad fråga.</p>\n<p><code class=\"docutils literal notranslate\">for_save</code> är en boolean som, när den är <code class=\"docutils literal notranslate\">True</code>, signalerar att den fråga som körs utför en skapelse eller uppdatering.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.get_source_expressions\">\n<span class=\"sig-name descname\">get_source_expressions</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.get_source_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar en ordnad lista med inre uttryck. Till exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Sum<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>get_source_expressions<span class=\"p\">()</span>\n<span class=\"go\">[F(&#39;foo&#39;)]</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.set_source_expressions\">\n<span class=\"sig-name descname\">set_source_expressions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expressions</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.set_source_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Tar emot en lista med uttryck och lagrar dem så att <code class=\"docutils literal notranslate\">get_source_expressions()</code> kan returnera dem.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.relabeled_clone\">\n<span class=\"sig-name descname\">relabeled_clone</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">change_map</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.relabeled_clone\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar en klon (kopia) av <code class=\"docutils literal notranslate\">self</code>, med eventuella kolumnaliaser ommärkta. Kolumnaliaser byter namn när underförfrågningar skapas. <code class=\"docutils literal notranslate\">relabeled_clone()</code> bör också anropas på alla nästlade uttryck och tilldelas klonen.</p>\n<p><code class=\"docutils literal notranslate\">change_map</code> är en ordlista som mappar gamla alias till nya alias.</p>\n<p>Exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">relabeled_clone</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> change_map<span class=\"p\">):</span>\n    clone <span class=\"o\">=</span> copy<span class=\"o\">.</span>copy<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n    clone<span class=\"o\">.</span>expression <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expression<span class=\"o\">.</span>relabeled_clone<span class=\"p\">(</span>change_map<span class=\"p\">)</span>\n    <span class=\"k\">return</span> clone\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.convert_value\">\n<span class=\"sig-name descname\">convert_value</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\">connection</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.convert_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>En hook som gör det möjligt för uttrycket att tvinga <code class=\"docutils literal notranslate\">värde</code> till en mer lämplig typ.</p>\n<p><code class=\"docutils literal notranslate\">uttryck</code> är detsamma som <code class=\"docutils literal notranslate\">själv</code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.get_group_by_cols\">\n<span class=\"sig-name descname\">get_group_by_cols</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.get_group_by_cols\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Responsible for returning the list of columns referenced by\nthis expression. <code class=\"docutils literal notranslate\">get_group_by_cols()</code> should be called on any\nnested expressions. <code class=\"docutils literal notranslate\">F()</code> objects, in particular, hold a reference\nto a column.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.asc\">\n<span class=\"sig-name descname\">asc</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">nulls_first<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">nulls_last<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.asc\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar det uttryck som är klart att sorteras i stigande ordning.</p>\n<p><code class=\"docutils literal notranslate\">nulls_first</code> och <code class=\"docutils literal notranslate\">nulls_last</code> definierar hur null-värden sorteras. Se <a class=\"reference internal\" href=\"#using-f-to-sort-null-values\"><span class=\"std std-ref\">Använda F() för att sortera nollvärden</span></a> för exempel på användning.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.desc\">\n<span class=\"sig-name descname\">desc</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">nulls_first<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">nulls_last<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.desc\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar det uttryck som är klart att sorteras i fallande ordning.</p>\n<p><code class=\"docutils literal notranslate\">nulls_first</code> och <code class=\"docutils literal notranslate\">nulls_last</code> definierar hur null-värden sorteras. Se <a class=\"reference internal\" href=\"#using-f-to-sort-null-values\"><span class=\"std std-ref\">Använda F() för att sortera nollvärden</span></a> för exempel på användning.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.reverse_ordering\">\n<span class=\"sig-name descname\">reverse_ordering</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.reverse_ordering\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\">self</code> with any modifications required to reverse the sort\norder within an <code class=\"docutils literal notranslate\">order_by</code> call. As an example, an expression\nimplementing <code class=\"docutils literal notranslate\">NULLS LAST</code> would change its value to be\n<code class=\"docutils literal notranslate\">NULLS FIRST</code>. Modifications are only required for expressions that\nimplement sort order like <code class=\"docutils literal notranslate\">OrderBy</code>. This method is called when\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.reverse\" title=\"django.db.models.query.QuerySet.reverse\"><code class=\"xref py py-meth docutils literal notranslate\">reverse()</code></a> is called on a\nqueryset.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"writing-your-own-query-expressions\">\n<span id=\"id6\"></span><h3>Skriva dina egna frågeuttryck<a class=\"heading-anchor\" href=\"#writing-your-own-query-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan skriva dina egna query expression-klasser som använder och kan integreras med andra query expressions. Låt oss gå igenom ett exempel genom att skriva en implementation av SQL-funktionen <code class=\"docutils literal notranslate\">COALESCE</code>, utan att använda de inbyggda <a class=\"reference internal\" href=\"#func-expressions\"><span class=\"std std-ref\">Func()-uttrycken</span></a>.</p>\n<p>SQL-funktionen <code class=\"docutils literal notranslate\">COALESCE</code> definieras som att den tar en lista med kolumner eller värden. Den returnerar den första kolumnen eller värdet som inte är <code class=\"docutils literal notranslate\">NULL</code>.</p>\n<p>Vi börjar med att definiera den mall som ska användas för SQL-generering och en <code class=\"docutils literal notranslate\">__init__()</code>-metod för att ställa in några attribut:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Expression\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Coalesce</span><span class=\"p\">(</span>Expression<span class=\"p\">):</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;COALESCE( </span><span class=\"si\">%(expressions)s</span><span class=\"s2\"> )&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expressions<span class=\"p\">,</span> output_field<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>output_field<span class=\"o\">=</span>output_field<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span>expressions<span class=\"p\">)</span> <span class=\"o\">&lt;</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;expressions must have at least 2 elements&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> expression <span class=\"ow\">in</span> expressions<span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> <span class=\"s2\">&quot;resolve_expression&quot;</span><span class=\"p\">):</span>\n                <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> is not an Expression&quot;</span> <span class=\"o\">%</span> expression<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>expressions <span class=\"o\">=</span> expressions\n</code></pre></div>\n<p>Vi gör en del grundläggande validering av parametrarna, inklusive att kräva minst 2 kolumner eller värden och säkerställa att de är uttryck. Vi kräver <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> här så att Django vet vilken typ av modellfält som ska tilldelas det slutliga resultatet.</p>\n<p>Nu implementerar vi förbehandling och validering. Eftersom vi inte har någon egen validering vid denna tidpunkt delegerar vi till de nästlade uttrycken:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">resolve_expression</span><span class=\"p\">(</span>\n    <span class=\"bp\">self</span><span class=\"p\">,</span> query<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> allow_joins<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> reuse<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> summarize<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> for_save<span class=\"o\">=</span><span class=\"kc\">False</span>\n<span class=\"p\">):</span>\n    c <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>copy<span class=\"p\">()</span>\n    c<span class=\"o\">.</span>is_summary <span class=\"o\">=</span> summarize\n    <span class=\"k\">for</span> pos<span class=\"p\">,</span> expression <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>expressions<span class=\"p\">):</span>\n        c<span class=\"o\">.</span>expressions<span class=\"p\">[</span>pos<span class=\"p\">]</span> <span class=\"o\">=</span> expression<span class=\"o\">.</span>resolve_expression<span class=\"p\">(</span>\n            query<span class=\"p\">,</span> allow_joins<span class=\"p\">,</span> reuse<span class=\"p\">,</span> summarize<span class=\"p\">,</span> for_save\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> c\n</code></pre></div>\n<p>Därefter skriver vi den metod som ansvarar för att generera SQL:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">as_sql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> template<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    sql_expressions<span class=\"p\">,</span> sql_params <span class=\"o\">=</span> <span class=\"p\">[],</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> expression <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expressions<span class=\"p\">:</span>\n        sql<span class=\"p\">,</span> params <span class=\"o\">=</span> compiler<span class=\"o\">.</span>compile<span class=\"p\">(</span>expression<span class=\"p\">)</span>\n        sql_expressions<span class=\"o\">.</span>append<span class=\"p\">(</span>sql<span class=\"p\">)</span>\n        sql_params<span class=\"o\">.</span>extend<span class=\"p\">(</span>params<span class=\"p\">)</span>\n    template <span class=\"o\">=</span> template <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span>template\n    data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;expressions&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>sql_expressions<span class=\"p\">)}</span>\n    <span class=\"k\">return</span> template <span class=\"o\">%</span> data<span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span>sql_params<span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">as_oracle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Example of vendor specific handling (Oracle in this case).</span>\n<span class=\"sd\">    Let&#39;s make the function name lowercase.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> template<span class=\"o\">=</span><span class=\"s2\">&quot;coalesce( </span><span class=\"si\">%(expressions)s</span><span class=\"s2\"> )&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>metoderna <code class=\"docutils literal notranslate\">as_sql()</code> kan stödja anpassade nyckelordsargument, vilket gör att metoderna <code class=\"docutils literal notranslate\">as_vendorname()</code> kan åsidosätta data som används för att generera SQL-strängen. Att använda <code class=\"docutils literal notranslate\">as_sql()</code> nyckelordsargument för anpassning är att föredra framför att mutera <code class=\"docutils literal notranslate\">self</code> inom <code class=\"docutils literal notranslate\">as_vendorname()</code>-metoder eftersom det senare kan leda till fel när det körs på olika databasbackends. Om din klass förlitar sig på klassattribut för att definiera data, överväg att tillåta åsidosättningar i din <code class=\"docutils literal notranslate\">as_sql()</code>-metod.</p>\n<p>Vi genererar SQL för vart och ett av <code class=\"docutils literal notranslate\">uttrycken</code> med hjälp av metoden <code class=\"docutils literal notranslate\">compiler.compile()</code> och sammanfogar resultatet med kommatecken. Sedan fylls mallen i med våra data och SQL och parametrar returneras.</p>\n<p>Vi har också definierat en anpassad implementering som är specifik för Oracle-backend. Funktionen <code class=\"docutils literal notranslate\">as_oracle()</code> kommer att anropas istället för <code class=\"docutils literal notranslate\">as_sql()</code> om Oracle-backend används.</p>\n<p>Slutligen implementerar vi resten av de metoder som gör att vårt frågeuttryck kan fungera bra tillsammans med andra frågeuttryck:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">get_source_expressions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expressions\n\n\n<span class=\"k\">def</span> <span class=\"nf\">set_source_expressions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expressions<span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span>expressions <span class=\"o\">=</span> expressions\n</code></pre></div>\n<p>Låt oss se hur det fungerar:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Value<span class=\"p\">,</span> CharField\n<span class=\"gp\">&gt;&gt;&gt; </span>qs <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    tagline<span class=\"o\">=</span>Coalesce<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;motto&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;ticker_name&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;description&quot;</span><span class=\"p\">),</span> Value<span class=\"p\">(</span><span class=\"s2\">&quot;No Tagline&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        output_field<span class=\"o\">=</span>CharField<span class=\"p\">(),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> c <span class=\"ow\">in</span> qs<span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>c<span class=\"o\">.</span>name<span class=\"p\">,</span> c<span class=\"o\">.</span>tagline<span class=\"p\">))</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">Google: Do No Evil</span>\n<span class=\"go\">Apple: AAPL</span>\n<span class=\"go\">Yahoo: Internet Company</span>\n<span class=\"go\">Django Software Foundation: No Tagline</span>\n</code></pre></div>\n<section id=\"avoiding-sql-injection\">\n<span id=\"avoiding-sql-injection-in-query-expressions\"></span><h4>Undvika SQL-injektion<a class=\"heading-anchor\" href=\"#avoiding-sql-injection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Eftersom nyckelordsargumenten i en <code class=\"docutils literal notranslate\">Func</code> för <code class=\"docutils literal notranslate\">__init__()</code> (<code class=\"docutils literal notranslate\">**extra</code>) och <code class=\"docutils literal notranslate\">as_sql()</code> (<code class=\"docutils literal notranslate\">**extra_context</code>) interpoleras in i SQL-strängen i stället för att skickas som frågeparametrar (där databasdrivrutinen skulle undkomma dem), får de inte innehålla otillförlitlig användarinmatning.</p>\n<p>Om till exempel <code class=\"docutils literal notranslate\">substring</code> är användartillhandahållen, är denna funktion sårbar för SQL-injektion:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Func\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Position</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;POSITION&quot;</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(&#39;</span><span class=\"si\">%(substring)s</span><span class=\"s2\">&#39; in </span><span class=\"si\">%(expressions)s</span><span class=\"s2\">)&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> substring<span class=\"p\">):</span>\n        <span class=\"c1\"># substring=substring is an SQL injection vulnerability!</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> substring<span class=\"o\">=</span>substring<span class=\"p\">)</span>\n</code></pre></div>\n<p>Denna funktion genererar en SQL-sträng utan några parametrar. Eftersom <code class=\"docutils literal notranslate\">substring</code> skickas till <code class=\"docutils literal notranslate\">super().__init__()</code> som ett nyckelordsargument, interpoleras det till SQL-strängen innan frågan skickas till databasen.</p>\n<p>Här är en korrigerad omskrivning:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Position</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;POSITION&quot;</span>\n    arg_joiner <span class=\"o\">=</span> <span class=\"s2\">&quot; IN &quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> substring<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>substring<span class=\"p\">,</span> expression<span class=\"p\">)</span>\n</code></pre></div>\n<p>Om <code class=\"docutils literal notranslate\">substring</code> istället skickas som ett positionellt argument kommer det att skickas som en parameter i databasfrågan.</p>\n</section>\n</section>\n<section id=\"adding-support-in-third-party-database-backends\">\n<h3>Lägga till stöd för databasbackends från tredje part<a class=\"heading-anchor\" href=\"#adding-support-in-third-party-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du använder en databasbackend som använder en annan SQL-syntax för en viss funktion kan du lägga till stöd för den genom att apa till en ny metod till funktionens klass.</p>\n<p>Låt oss säga att vi skriver en backend för Microsofts SQL Server som använder SQL <code class=\"docutils literal notranslate\">LEN</code> istället för <code class=\"docutils literal notranslate\">LENGTH</code> för funktionen <a class=\"reference internal\" href=\"/sv/6.0/ref/models/database-functions/#django.db.models.functions.Length\" title=\"django.db.models.functions.Length\"><code class=\"xref py py-class docutils literal notranslate\">Length</code></a>. Vi kommer att apa patch en ny metod som heter <code class=\"docutils literal notranslate\">as_sqlserver()</code> på klassen <code class=\"docutils literal notranslate\">Length</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length\n\n\n<span class=\"k\">def</span> <span class=\"nf\">sqlserver_length</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> function<span class=\"o\">=</span><span class=\"s2\">&quot;LEN&quot;</span><span class=\"p\">)</span>\n\n\nLength<span class=\"o\">.</span>as_sqlserver <span class=\"o\">=</span> sqlserver_length\n</code></pre></div>\n<p>Du kan också anpassa SQL genom att använda parametern <code class=\"docutils literal notranslate\">template</code> i <code class=\"docutils literal notranslate\">as_sql()</code>.</p>\n<p>Vi använder <code class=\"docutils literal notranslate\">as_sqlserver()</code> eftersom <code class=\"docutils literal notranslate\">django.db.connection.vendor</code> returnerar <code class=\"docutils literal notranslate\">sqlserver</code> för backend.</p>\n<p>Tredjeparts backends kan registrera sina funktioner i toppnivån <code class=\"docutils literal notranslate\">__init__.py</code>-filen i backend-paketet eller i en toppnivå <code class=\"docutils literal notranslate\">expressions.py</code>-fil (eller paket) som importeras från toppnivån <code class=\"docutils literal notranslate\">__init__.py</code>.</p>\n<p>För användarprojekt som vill patcha den backend som de använder bör den här koden finnas i en <a class=\"reference internal\" href=\"/sv/6.0/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">AppConfig.ready()</code></a>-metod.</p>\n</section>\n</section>","rootId":"query-expressions","toc":[{"title":"Stöd för aritmetik","anchor":"supported-arithmetic","children":[]},{"title":"Utgångsfält","anchor":"output-field","children":[]},{"title":"Några exempel","anchor":"some-examples","children":[]},{"title":"Inbyggda uttryck","anchor":"built-in-expressions","children":[{"title":"F()-uttryck","anchor":"f-expressions","children":[{"title":"Skivning av F()-uttryck","anchor":"slicing-f-expressions","children":[]},{"title":"Undvika tävlingsförhållanden med hjälp av F()","anchor":"avoiding-race-conditions-using-f","children":[]},{"title":"F() assignments are refreshed after Model.save()","anchor":"f-assignments-are-refreshed-after-model-save","children":[]},{"title":"Använda F() i filter","anchor":"using-f-in-filters","children":[]},{"title":"Använda F() med annotationer","anchor":"using-f-with-annotations","children":[]},{"title":"Använda F() för att sortera nollvärden","anchor":"using-f-to-sort-null-values","children":[]},{"title":"Använda F() med logiska operationer","anchor":"using-f-with-logical-operations","children":[]}]},{"title":"Func() uttryck","anchor":"func-expressions","children":[]},{"title":"uttryck för Aggregate()","anchor":"aggregate-expressions","children":[]},{"title":"Skapa dina egna aggregerade funktioner","anchor":"creating-your-own-aggregate-functions","children":[]},{"title":"uttryck för Value()","anchor":"value-expressions","children":[]},{"title":"ExpressionWrapper() uttryck","anchor":"expressionwrapper-expressions","children":[]},{"title":"Villkorliga uttryck","anchor":"conditional-expressions","children":[]},{"title":"uttryck för Subquery()","anchor":"subquery-expressions","children":[{"title":"Hänvisning till kolumner från den yttre queryset","anchor":"referencing-columns-from-the-outer-queryset","children":[]},{"title":"Begränsa en underfrågeställning till en enda kolumn","anchor":"limiting-a-subquery-to-a-single-column","children":[]},{"title":"Begränsa underfrågeställningen till en enda rad","anchor":"limiting-the-subquery-to-a-single-row","children":[]},{"title":"Existerar() underfrågor","anchor":"exists-subqueries","children":[]},{"title":"Filtrering på ett Subquery()- eller Exists()-uttryck","anchor":"filtering-on-a-subquery-or-exists-expressions","children":[]},{"title":"Använda aggregat inom ett Subquery-uttryck","anchor":"using-aggregates-within-a-subquery-expression","children":[]}]},{"title":"Råa SQL-uttryck","anchor":"raw-sql-expressions","children":[]},{"title":"Fönsterfunktioner","anchor":"window-functions","children":[{"title":"Ramar","anchor":"frames","children":[]}]}]},{"title":"Teknisk information","anchor":"technical-information","children":[{"title":"Uttryck API","anchor":"expression-api","children":[]},{"title":"Skriva dina egna frågeuttryck","anchor":"writing-your-own-query-expressions","children":[{"title":"Undvika SQL-injektion","anchor":"avoiding-sql-injection","children":[]}]},{"title":"Lägga till stöd för databasbackends från tredje part","anchor":"adding-support-in-third-party-database-backends","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API-referens","url":"/sv/6.0/ref/"},{"docname":"ref/models/index","title":"Modeller","url":"/sv/6.0/ref/models/"}],"prev":{"docname":"ref/models/lookups","title":"API-referens för uppslagning","url":"/sv/6.0/ref/models/lookups/"},"next":{"docname":"ref/models/conditional-expressions","title":"Villkorliga uttryck","url":"/sv/6.0/ref/models/conditional-expressions/"},"formats":{"html":"/sv/6.0/ref/models/expressions/","markdown":"/sv/6.0/ref/models/expressions.md","json":"/sv/6.0/ref/models/expressions.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/ref/models/expressions.txt","official":"https://docs.djangoproject.com/sv/6.0/ref/models/expressions/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}