{"title":"Conditional Expressions","version":"4.0","locale":"es","docname":"ref/models/conditional-expressions","url":"/es/4.0/ref/models/conditional-expressions/","canonical":"https://djangodocs.dev/es/4.0/ref/models/conditional-expressions/","summary":"Conditional expressions let you use if … elif … else logic within filters, annotations, aggregations, and updates.","html":"<h1>Conditional Expressions<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>Conditional expressions let you use <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(en Python versión 3.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=\"(en Python versión 3.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=\"(en Python versión 3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">else</code></a> logic within filters, annotations, aggregations, and updates. A\nconditional expression evaluates a series of conditions for each row of a\ntable and returns the matching result expression. Conditional expressions can\nalso be combined and nested like other <a class=\"reference internal\" href=\"/es/4.0/ref/models/expressions/\"><span class=\"doc\">expressions</span></a>.</p>\n<section id=\"the-conditional-expression-classes\">\n<h2>The conditional expression classes<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>We’ll be using the following model in the subsequent examples:</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<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=\"s1\">&#39;R&#39;</span>\n    GOLD <span class=\"o\">=</span> <span class=\"s1\">&#39;G&#39;</span>\n    PLATINUM <span class=\"o\">=</span> <span class=\"s1\">&#39;P&#39;</span>\n    ACCOUNT_TYPE_CHOICES <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span>REGULAR<span class=\"p\">,</span> <span class=\"s1\">&#39;Regular&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span>GOLD<span class=\"p\">,</span> <span class=\"s1\">&#39;Gold&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span>PLATINUM<span class=\"p\">,</span> <span class=\"s1\">&#39;Platinum&#39;</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\">When</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>A <code class=\"docutils literal notranslate\">When()</code> object is used to encapsulate a condition and its result for use\nin the conditional expression. Using a <code class=\"docutils literal notranslate\">When()</code> object is similar to using\nthe <a class=\"reference internal\" href=\"/es/4.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> method. The condition can\nbe specified using <a class=\"reference internal\" href=\"/es/4.0/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">field lookups</span></a>,\n<a class=\"reference internal\" href=\"/es/4.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</code></a> objects, or <a class=\"reference internal\" href=\"/es/4.0/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\">Expression</code></a>\nobjects that have an <code class=\"docutils literal notranslate\">output_field</code> that is a\n<a class=\"reference internal\" href=\"/es/4.0/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>. The result is provided using the\n<code class=\"docutils literal notranslate\">then</code> keyword.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.0</p><p>Support for lookup expressions was added.</p>\n</aside>\n<p>Some examples:</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=\"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=\"s1\">&#39;name&#39;</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=\"s1\">&#39;name&#39;</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>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=\"s1\">&#39;account_type&#39;</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>\n<span class=\"gp\">... </span>     then<span class=\"o\">=</span><span class=\"s1\">&#39;name&#39;</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> 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=\"s1\">&#39;account_type&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>exclude<span class=\"p\">(</span>pk<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s1\">&#39;pk&#39;</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=\"s1\">&#39;non unique&#39;</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=\"s1\">&#39;registered_on&#39;</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> <span class=\"o\">&amp;</span>\n<span class=\"gp\">... </span>    LessThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;registered_on&#39;</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=\"s1\">&#39;account_type&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Keep in mind that each of these values can be an expression.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Since the <code class=\"docutils literal notranslate\">then</code> keyword argument is reserved for the result of the\n<code class=\"docutils literal notranslate\">When()</code>, there is a potential conflict if a\n<a class=\"reference internal\" href=\"/es/4.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> has a field named <code class=\"docutils literal notranslate\">then</code>. This can be\nresolved in two ways:</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=\"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<aside class=\"version-note version-changed\" data-version=\"3.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>Support for using the <code class=\"docutils literal notranslate\">condition</code> argument with <code class=\"docutils literal notranslate\">lookups</code> was added.</p>\n</aside>\n</section>\n<section id=\"case\">\n<h3><code class=\"docutils literal notranslate\">Case</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>A <code class=\"docutils literal notranslate\">Case()</code> expression is like the <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(en Python versión 3.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=\"(en Python versión 3.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=\"(en Python versión 3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">else</code></a> statement in <code class=\"docutils literal notranslate\">Python</code>. Each <code class=\"docutils literal notranslate\">condition</code> in the provided\n<code class=\"docutils literal notranslate\">When()</code> objects is evaluated in order, until one evaluates to a\ntruthful value. The <code class=\"docutils literal notranslate\">result</code> expression from the matching <code class=\"docutils literal notranslate\">When()</code> object\nis returned.</p>\n<p>An example:</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=\"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=\"s1\">&#39;Jane Doe&#39;</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\">&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=\"s1\">&#39;James Smith&#39;</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\">&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=\"s1\">&#39;Jack Black&#39;</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\">&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=\"s1\">&#39;5%&#39;</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=\"s1\">&#39;10%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        default<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s1\">&#39;0%&#39;</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=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;discount&#39;</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> accepts any number of <code class=\"docutils literal notranslate\">When()</code> objects as individual arguments.\nOther options are provided using keyword arguments. If none of the conditions\nevaluate to <code class=\"docutils literal notranslate\">TRUE</code>, then the expression given with the <code class=\"docutils literal notranslate\">default</code> keyword\nargument is returned. If a <code class=\"docutils literal notranslate\">default</code> argument isn’t provided, <code class=\"docutils literal notranslate\">None</code> is\nused.</p>\n<p>If we wanted to change our previous query to get the discount based on how long\nthe <code class=\"docutils literal notranslate\">Client</code> has been with us, we could do so using lookups:</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=\"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=\"s1\">&#39;10%&#39;</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=\"s1\">&#39;5%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        default<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s1\">&#39;0%&#39;</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=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;discount&#39;</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\">Nota</p>\n<p>Remember that the conditions are evaluated in order, so in the above\nexample we get the correct result even though the second condition matches\nboth Jane Doe and Jack Black. This works just like an <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(en Python versión 3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">if</code></a> …\n<a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(en Python versión 3.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=\"(en Python versión 3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">else</code></a> statement in <code class=\"docutils literal notranslate\">Python</code>.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\">Case()</code> also works in a <code class=\"docutils literal notranslate\">filter()</code> clause. For example, to find gold\nclients that registered more than a month ago and platinum clients that\nregistered more than a year ago:</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=\"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=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;account_type&#39;</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>Advanced queries<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>Conditional expressions can be used in annotations, aggregations, filters,\nlookups, and updates. They can also be combined and nested with other\nexpressions. This allows you to make powerful conditional queries.</p>\n<section id=\"conditional-update\">\n<h3>Conditional update<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>Let’s say we want to change the <code class=\"docutils literal notranslate\">account_type</code> for our clients to match\ntheir registration dates. We can do this using a conditional expression and the\n<a class=\"reference internal\" href=\"/es/4.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> method:</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=\"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>\n<span class=\"gp\">... </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>\n<span class=\"gp\">... </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=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;account_type&#39;</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>Conditional aggregation<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>What if we want to find out how many clients there are for each\n<code class=\"docutils literal notranslate\">account_type</code>? We can use the <code class=\"docutils literal notranslate\">filter</code> argument of <a class=\"reference internal\" href=\"/es/4.0/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">aggregate\nfunctions</span></a> to achieve this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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=\"s1\">&#39;Jean Grey&#39;</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>\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=\"s1\">&#39;James Bond&#39;</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>\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=\"s1\">&#39;Jane Porter&#39;</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>\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=\"s1\">&#39;pk&#39;</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=\"s1\">&#39;pk&#39;</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=\"s1\">&#39;pk&#39;</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>This aggregate produces a query with the SQL 2003 <code class=\"docutils literal notranslate\">FILTER WHERE</code> syntax\non databases that support it:</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>On other databases, this is emulated using a <code class=\"docutils literal notranslate\">CASE</code> statement:</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>The two SQL statements are functionally equivalent but the more explicit\n<code class=\"docutils literal notranslate\">FILTER</code> may perform better.</p>\n</section>\n<section id=\"conditional-filter\">\n<h3>Conditional 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>When a conditional expression returns a boolean value, it is possible to use it\ndirectly in filters. This means that it will not be added to the <code class=\"docutils literal notranslate\">SELECT</code>\ncolumns, but you can still use it to filter results:</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=\"gp\">&gt;&gt;&gt; </span>non_unique_account_type <span class=\"o\">=</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=\"s1\">&#39;account_type&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>exclude<span class=\"p\">(</span>pk<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s1\">&#39;pk&#39;</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>In SQL terms, that evaluates to:</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":"The conditional expression classes","anchor":"the-conditional-expression-classes","children":[{"title":"When","anchor":"when","children":[]},{"title":"Case","anchor":"case","children":[]}]},{"title":"Advanced queries","anchor":"advanced-queries","children":[{"title":"Conditional update","anchor":"conditional-update","children":[]},{"title":"Conditional aggregation","anchor":"conditional-aggregation","children":[]},{"title":"Conditional filter","anchor":"conditional-filter","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/es/4.0/ref/"},{"docname":"ref/models/index","title":"Models","url":"/es/4.0/ref/models/"}],"prev":{"docname":"ref/models/expressions","title":"Query Expressions","url":"/es/4.0/ref/models/expressions/"},"next":{"docname":"ref/models/database-functions","title":"Database Functions","url":"/es/4.0/ref/models/database-functions/"},"formats":{"html":"/es/4.0/ref/models/conditional-expressions/","markdown":"/es/4.0/ref/models/conditional-expressions.md","json":"/es/4.0/ref/models/conditional-expressions.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/ref/models/conditional-expressions.txt","official":"https://docs.djangoproject.com/es/4.0/ref/models/conditional-expressions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}