{"title":"Villkorliga uttryck","version":"5.2","locale":"sv","docname":"ref/models/conditional-expressions","url":"/sv/5.2/ref/models/conditional-expressions/","canonical":"https://djangodocs.dev/sv/5.2/ref/models/conditional-expressions/","summary":"Med villkorliga uttryck kan du använda logiken if … elif … else i filter, annoteringar, aggregeringar och uppdateringar.","html":"<h1>Villkorliga uttryck<a class=\"heading-anchor\" href=\"#conditional-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Med villkorliga uttryck kan du använda logiken <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> … <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> i filter, annoteringar, aggregeringar och uppdateringar. Ett villkorligt uttryck utvärderar en serie villkor för varje rad i en tabell och returnerar det matchande resultatuttrycket. Villkorliga uttryck kan också kombineras och nästlas på samma sätt som andra <a class=\"reference internal\" href=\"/sv/5.2/ref/models/expressions/\"><span class=\"doc\">uttryck</span></a>.</p>\n<section id=\"the-conditional-expression-classes\">\n<h2>Klasserna för villkorliga uttryck<a class=\"heading-anchor\" href=\"#the-conditional-expression-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vi kommer att använda följande modell i de följande exemplen:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Client</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    REGULAR <span class=\"o\">=</span> <span class=\"s2\">&quot;R&quot;</span>\n    GOLD <span class=\"o\">=</span> <span class=\"s2\">&quot;G&quot;</span>\n    PLATINUM <span class=\"o\">=</span> <span class=\"s2\">&quot;P&quot;</span>\n    ACCOUNT_TYPE_CHOICES <span class=\"o\">=</span> <span class=\"p\">{</span>\n        REGULAR<span class=\"p\">:</span> <span class=\"s2\">&quot;Regular&quot;</span><span class=\"p\">,</span>\n        GOLD<span class=\"p\">:</span> <span class=\"s2\">&quot;Gold&quot;</span><span class=\"p\">,</span>\n        PLATINUM<span class=\"p\">:</span> <span class=\"s2\">&quot;Platinum&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    registered_on <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    account_type <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n        choices<span class=\"o\">=</span>ACCOUNT_TYPE_CHOICES<span class=\"p\">,</span>\n        default<span class=\"o\">=</span>REGULAR<span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"when\">\n<h3><code class=\"docutils literal notranslate\">När</code><a class=\"heading-anchor\" href=\"#when\"><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.When\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">When</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">condition<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">then<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>lookups</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.When\"><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\">When()</code>-objekt används för att kapsla in ett villkor och dess resultat för användning i det villkorliga uttrycket. Att använda ett <code class=\"docutils literal notranslate\">When()</code>-objekt liknar att använda metoden <a class=\"reference internal\" href=\"/sv/5.2/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>. Villkoret kan anges med <a class=\"reference internal\" href=\"/sv/5.2/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">field lookups</span></a>, <a class=\"reference internal\" href=\"/sv/5.2/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</code></a>-objekt eller <a class=\"reference internal\" href=\"/sv/5.2/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\">Expression</code></a>-objekt som har ett <code class=\"docutils literal notranslate\">output_field</code> som är ett <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>. Resultatet tillhandahålls med hjälp av nyckelordet <code class=\"docutils literal notranslate\">then</code>.</p>\n<p>Några 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</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Q<span class=\"p\">,</span> When\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># String arguments refer to fields; the following two examples are equivalent:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">,</span> then<span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">,</span> then<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># You can use field lookups in the condition</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    registered_on__gt<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2014</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    registered_on__lt<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2015</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    then<span class=\"o\">=</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Complex conditions can be created using Q objects</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>Q<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Paul&quot;</span><span class=\"p\">),</span> then<span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Condition can be created using boolean expressions.</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>non_unique_account_type <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        account_type<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>exclude<span class=\"p\">(</span>pk<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>    <span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>Exists<span class=\"p\">(</span>non_unique_account_type<span class=\"p\">),</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;non unique&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Condition can be created using lookup expressions.</span>\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<span class=\"p\">,</span> LessThan\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    GreaterThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;registered_on&quot;</span><span class=\"p\">),</span> date<span class=\"p\">(</span><span class=\"mi\">2014</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">&amp;</span> LessThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;registered_on&quot;</span><span class=\"p\">),</span> date<span class=\"p\">(</span><span class=\"mi\">2015</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    then<span class=\"o\">=</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Tänk på att vart och ett av dessa värden kan vara ett uttryck.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Eftersom nyckelordsargumentet <code class=\"docutils literal notranslate\">then</code> är reserverat för resultatet av <code class=\"docutils literal notranslate\">When()</code>, finns det en potentiell konflikt om en <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> har ett fält med namnet <code class=\"docutils literal notranslate\">then</code>. Detta kan lösas på två sätt:</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>When<span class=\"p\">(</span>then__exact<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> then<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>When<span class=\"p\">(</span>Q<span class=\"p\">(</span>then<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">),</span> then<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"case\">\n<h3><code class=\"docutils literal notranslate\">Fall</code><a class=\"heading-anchor\" href=\"#case\"><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.Case\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Case</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>cases</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Case\"><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\">Case()</code>-uttryck är som <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> … <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>-satsen i <code class=\"docutils literal notranslate\">Python</code>. Varje <code class=\"docutils literal notranslate\">villkor</code> i de medföljande <code class=\"docutils literal notranslate\">When()</code>-objekten utvärderas i ordning, tills ett utvärderas till ett sanningsenligt värde. <code class=\"docutils literal notranslate\">result</code>-uttrycket från det matchande <code class=\"docutils literal notranslate\">When()</code>-objektet returneras.</p>\n<p>Ett 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>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date<span class=\"p\">,</span> timedelta\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> Case<span class=\"p\">,</span> Value<span class=\"p\">,</span> When\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;Jane Doe&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>REGULAR<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">36</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;James Smith&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;Jack Black&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">10</span> <span class=\"o\">*</span> <span class=\"mi\">365</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the discount for each Client based on the account type</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    discount<span class=\"o\">=</span>Case<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;5%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;10%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        default<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;0%&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;discount&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;0%&#39;), (&#39;James Smith&#39;, &#39;5%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Case()</code> accepterar ett valfritt antal <code class=\"docutils literal notranslate\">When()</code> objekt som individuella argument. Andra alternativ ges med hjälp av nyckelordsargument. Om inget av villkoren utvärderas till <code class=\"docutils literal notranslate\">TRUE</code>, returneras det uttryck som anges med <code class=\"docutils literal notranslate\">default</code> nyckelordsargumentet. Om ett <code class=\"docutils literal notranslate\">default</code> argument inte anges, används <code class=\"docutils literal notranslate\">None</code>.</p>\n<p>Om vi ville ändra vår tidigare fråga för att få rabatten baserat på hur länge <code class=\"docutils literal notranslate\">Client</code> har varit hos oss, kan vi göra det med hjälp av uppslagningar:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>a_month_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a_year_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the discount for each Client based on the registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    discount<span class=\"o\">=</span>Case<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>registered_on__lte<span class=\"o\">=</span>a_year_ago<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;10%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>registered_on__lte<span class=\"o\">=</span>a_month_ago<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;5%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        default<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;0%&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;discount&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;5%&#39;), (&#39;James Smith&#39;, &#39;0%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Kom ihåg att villkoren utvärderas i ordning, så i exemplet ovan får vi rätt resultat även om det andra villkoret matchar både Jane Doe och Jack Black. Det här fungerar precis som en <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> … <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>-sats i <code class=\"docutils literal notranslate\">Python</code>.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\">Case()</code> fungerar också i en <code class=\"docutils literal notranslate\">filter()</code>-sats. Till exempel:, för att hitta guldkunder som registrerade sig för mer än en månad sedan och platinakunder som registrerade sig för mer än ett år sedan:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>a_month_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a_year_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    registered_on__lte<span class=\"o\">=</span>Case<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">,</span> then<span class=\"o\">=</span>a_month_ago<span class=\"p\">),</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">,</span> then<span class=\"o\">=</span>a_year_ago<span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jack Black&#39;, &#39;P&#39;)]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"advanced-queries\">\n<h2>Avancerade frågor<a class=\"heading-anchor\" href=\"#advanced-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Villkorliga uttryck kan användas i annoteringar, aggregeringar, filter, uppslagningar och uppdateringar. De kan också kombineras och nästlas med andra uttryck. Detta gör att du kan skapa kraftfulla villkorliga frågor.</p>\n<section id=\"conditional-update\">\n<h3>Villkorlig uppdatering<a class=\"heading-anchor\" href=\"#conditional-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Låt oss säga att vi vill ändra <code class=\"docutils literal notranslate\">account_type</code> för våra kunder för att matcha deras registreringsdatum. Vi kan göra detta med hjälp av ett villkorligt uttryck och metoden <a class=\"reference internal\" href=\"/sv/5.2/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>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>a_month_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a_year_ago <span class=\"o\">=</span> date<span class=\"o\">.</span>today<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Update the account_type for each Client from the registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    account_type<span class=\"o\">=</span>Case<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>registered_on__lte<span class=\"o\">=</span>a_year_ago<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        When<span class=\"p\">(</span>registered_on__lte<span class=\"o\">=</span>a_month_ago<span class=\"p\">,</span> then<span class=\"o\">=</span>Value<span class=\"p\">(</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        default<span class=\"o\">=</span>Value<span class=\"p\">(</span>Client<span class=\"o\">.</span>REGULAR<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>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;G&#39;), (&#39;James Smith&#39;, &#39;R&#39;), (&#39;Jack Black&#39;, &#39;P&#39;)]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"conditional-aggregation\">\n<span id=\"id1\"></span><h3>Villkorlig aggregering<a class=\"heading-anchor\" href=\"#conditional-aggregation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vad händer om vi vill ta reda på hur många kunder det finns för varje <code class=\"docutils literal notranslate\">account_type</code>? Vi kan använda argumentet <code class=\"docutils literal notranslate\">filter</code> i <a class=\"reference internal\" href=\"/sv/5.2/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">aggregate functions</span></a> för att uppnå detta:</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\"># Create some more Clients first so we can have something to count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;Jean Grey&quot;</span><span class=\"p\">,</span> account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>REGULAR<span class=\"p\">,</span> registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;James Bond&quot;</span><span class=\"p\">,</span> account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">,</span> registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    name<span class=\"o\">=</span><span class=\"s2\">&quot;Jane Porter&quot;</span><span class=\"p\">,</span> account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">,</span> registered_on<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get counts for each value of account_type</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    regular<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>REGULAR<span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    gold<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>GOLD<span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    platinum<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>account_type<span class=\"o\">=</span>Client<span class=\"o\">.</span>PLATINUM<span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;regular&#39;: 2, &#39;gold&#39;: 1, &#39;platinum&#39;: 3}</span>\n</code></pre></div>\n<p>Detta aggregat producerar en fråga med SQL 2003-syntaxen <code class=\"docutils literal notranslate\">FILTER WHERE</code> i databaser som stöder den:</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=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span> FILTER <span class=\"p\">(</span><span class=\"k\">WHERE</span> account_type<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"k\">as</span> regular<span class=\"p\">,</span>\n       <span class=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span> FILTER <span class=\"p\">(</span><span class=\"k\">WHERE</span> account_type<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"k\">as</span> gold<span class=\"p\">,</span>\n       <span class=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span> FILTER <span class=\"p\">(</span><span class=\"k\">WHERE</span> account_type<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"k\">as</span> platinum\n<span class=\"k\">FROM</span> clients<span class=\"p\">;</span>\n</code></pre></div>\n<p>I andra databaser emuleras detta med hjälp av en <code class=\"docutils literal notranslate\">CASE</code>-sats:</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=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> account_type<span class=\"o\">=</span><span class=\"mi\">1</span> <span class=\"k\">THEN</span> id <span class=\"k\">ELSE</span> <span class=\"k\">null</span><span class=\"p\">)</span> <span class=\"k\">as</span> regular<span class=\"p\">,</span>\n       <span class=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> account_type<span class=\"o\">=</span><span class=\"mi\">2</span> <span class=\"k\">THEN</span> id <span class=\"k\">ELSE</span> <span class=\"k\">null</span><span class=\"p\">)</span> <span class=\"k\">as</span> gold<span class=\"p\">,</span>\n       <span class=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> account_type<span class=\"o\">=</span><span class=\"mi\">3</span> <span class=\"k\">THEN</span> id <span class=\"k\">ELSE</span> <span class=\"k\">null</span><span class=\"p\">)</span> <span class=\"k\">as</span> platinum\n<span class=\"k\">FROM</span> clients<span class=\"p\">;</span>\n</code></pre></div>\n<p>De två SQL-satserna är funktionellt likvärdiga, men den mer explicita <code class=\"docutils literal notranslate\">FILTER</code> kan ge bättre resultat.</p>\n</section>\n<section id=\"conditional-filter\">\n<h3>Villkorligt filter<a class=\"heading-anchor\" href=\"#conditional-filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När ett villkorligt uttryck returnerar ett booleskt värde är det möjligt att använda det direkt i filter. Det innebär att det inte läggs till i <code class=\"docutils literal notranslate\">SELECT</code>-kolumnerna, men du kan ändå använda det för att filtrera resultat:</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>non_unique_account_type <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        account_type<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>exclude<span class=\"p\">(</span>pk<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>    <span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Client<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"o\">~</span>Exists<span class=\"p\">(</span>non_unique_account_type<span class=\"p\">))</span>\n</code></pre></div>\n<p>I SQL-termer utvärderas detta till:</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=\"p\">...</span>\n<span class=\"k\">FROM</span> client c0\n<span class=\"k\">WHERE</span> <span class=\"k\">NOT</span> <span class=\"k\">EXISTS</span> <span class=\"p\">(</span>\n  <span class=\"k\">SELECT</span> c1<span class=\"p\">.</span>id\n  <span class=\"k\">FROM</span> client c1\n  <span class=\"k\">WHERE</span> c1<span class=\"p\">.</span>account_type <span class=\"o\">=</span> c0<span class=\"p\">.</span>account_type <span class=\"k\">AND</span> <span class=\"k\">NOT</span> c1<span class=\"p\">.</span>id <span class=\"o\">=</span> c0<span class=\"p\">.</span>id\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>","rootId":"conditional-expressions","toc":[{"title":"Klasserna för villkorliga uttryck","anchor":"the-conditional-expression-classes","children":[{"title":"När","anchor":"when","children":[]},{"title":"Fall","anchor":"case","children":[]}]},{"title":"Avancerade frågor","anchor":"advanced-queries","children":[{"title":"Villkorlig uppdatering","anchor":"conditional-update","children":[]},{"title":"Villkorlig aggregering","anchor":"conditional-aggregation","children":[]},{"title":"Villkorligt filter","anchor":"conditional-filter","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API-referens","url":"/sv/5.2/ref/"},{"docname":"ref/models/index","title":"Modeller","url":"/sv/5.2/ref/models/"}],"prev":{"docname":"ref/models/expressions","title":"Frågeuttryck","url":"/sv/5.2/ref/models/expressions/"},"next":{"docname":"ref/models/database-functions","title":"Databasfunktioner","url":"/sv/5.2/ref/models/database-functions/"},"formats":{"html":"/sv/5.2/ref/models/conditional-expressions/","markdown":"/sv/5.2/ref/models/conditional-expressions.md","json":"/sv/5.2/ref/models/conditional-expressions.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/models/conditional-expressions.txt","official":"https://docs.djangoproject.com/sv/5.2/ref/models/conditional-expressions/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}