{"title":"Expressions conditionnelles","version":"1.9","locale":"fr","docname":"ref/models/conditional-expressions","url":"/fr/1.9/ref/models/conditional-expressions/","canonical":"https://djangodocs.dev/fr/1.9/ref/models/conditional-expressions/","summary":"New in Django 1.8 Les expressions conditionnelles permettent d’utiliser de la logique if … elif … else à l’intérieur des filtres, des annotations, des agrégations…","html":"<h1>Expressions conditionnelles<a class=\"heading-anchor\" href=\"#conditional-expressions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"1.8\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p>Les expressions conditionnelles permettent d’utiliser de la logique <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> à l’intérieur des filtres, des annotations, des agrégations et des mises à jour. Une expression conditionnelle évalue une série de conditions pour chaque ligne d’une table et renvoie l’expression résultante correspondante. Les expressions conditionnelles peuvent également être combinées et imbriquées comme toute autre <a class=\"reference internal\" href=\"/fr/1.9/ref/models/expressions/\"><span class=\"doc\">expression</span></a>.</p>\n<section id=\"the-conditional-expression-classes\">\n<h2>Les classes d’expressions conditionnelles<a class=\"heading-anchor\" href=\"#the-conditional-expression-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nous allons utiliser le modèle suivant dans les exemples qui suivront :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Client</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">REGULAR</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;R&#39;</span>\n    <span class=\"n\">GOLD</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;G&#39;</span>\n    <span class=\"n\">PLATINUM</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;P&#39;</span>\n    <span class=\"n\">ACCOUNT_TYPE_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Regular&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Gold&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Platinum&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">registered_on</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">account_type</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n        <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">ACCOUNT_TYPE_CHOICES</span><span class=\"p\">,</span>\n        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"when\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">When</span></code><a class=\"heading-anchor\" href=\"#when\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">When</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">condition</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">then</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.When\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> est utilisé pour englober une condition et ses résultats pour leur exploitation dans une expression conditionnelle. L’emploi d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> est semblable à celui d’une méthode <a class=\"reference internal\" href=\"/fr/1.9/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\"><span class=\"pre\">filter()</span></code></a>. La condition peut être indiquée en utilisant des objets de <a class=\"reference internal\" href=\"/fr/1.9/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">recherche de champ</span></a> ou des objets <a class=\"reference internal\" href=\"/fr/1.9/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a>. Le résultat est fourni en utilisant le mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code>.</p>\n<p>Quelques exemples :</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">When</span><span class=\"p\">,</span> <span class=\"n\">F</span><span class=\"p\">,</span> <span class=\"n\">Q</span>\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><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><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=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">F</span><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=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__gt</span><span class=\"o\">=</span><span class=\"n\">date</span><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=\"n\">registered_on__lt</span><span class=\"o\">=</span><span class=\"n\">date</span><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>     <span class=\"n\">then</span><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><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Paul&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>     <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>N’oubliez pas que chacune de ces valeurs peut être elle-même une expression.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Comme le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code> est réservé au résultat de l’expression <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code>, un conflit potentiel existe si un <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> possède un champ nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code>. Ceci peut être résolu de deux manières :</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=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">then__exact</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">then</span><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\"><span class=\"pre\">Case</span></code><a class=\"heading-anchor\" href=\"#case\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Case</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">cases</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Case\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Une expression <code class=\"docutils literal notranslate\"><span class=\"pre\">Case()</span></code> est semblable à une instruction <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> en Python. Chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> dans les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> fournis est évaluée dans l’ordre, jusqu’à ce que l’une d’elle résulte en une valeur vraie. L’expression <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> correspondant est renvoyée.</p>\n<p>Un exemple simple :</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=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span><span class=\"p\">,</span> <span class=\"n\">timedelta</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CharField</span><span class=\"p\">,</span> <span class=\"n\">Case</span><span class=\"p\">,</span> <span class=\"n\">Value</span><span class=\"p\">,</span> <span class=\"n\">When</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Jane Doe&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">36</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;James Smith&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Jack Black&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><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><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">discount</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;5%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;10%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;0%&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">CharField</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><span class=\"n\">values_list</span><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\">[(&#39;Jane Doe&#39;, &#39;0%&#39;), (&#39;James Smith&#39;, &#39;5%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Case()</span></code> accepts any number of <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> objects as individual arguments.\nOther options are provided using keyword arguments. If none of the conditions\nevaluate to <code class=\"docutils literal notranslate\"><span class=\"pre\">TRUE</span></code>, then the expression given with the <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> keyword\nargument is returned. If a <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> argument isn’t provided, <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> is\nused.</p>\n<p>Si nous voulions modifier notre requête précédente pour obtenir le rabais sur la base de la fidélité de <code class=\"docutils literal notranslate\"><span class=\"pre\">Client</span></code>, nous pourrions le faire à l’aide d’expressions de recherche :</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=\"n\">a_month_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_year_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</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 registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">discount</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_year_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;10%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_month_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;5%&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s1\">&#39;0%&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">CharField</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><span class=\"n\">values_list</span><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\">[(&#39;Jane Doe&#39;, &#39;5%&#39;), (&#39;James Smith&#39;, &#39;0%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Rappelez-vous que les conditions sont évaluées dans l’ordre, ce qui fait que dans l’exemple ci-dessus, nous obtenons le résultat correct même si la seconde condition correspondait à la fois à Jane Doe et à Jack Black. Cela fonctionne exactement de la même manière qu’avec l’instruction <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> … <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(disponible dans Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> en Python.</p>\n</aside>\n</section>\n</section>\n<section id=\"advanced-queries\">\n<h2>Requêtes avancées<a class=\"heading-anchor\" href=\"#advanced-queries\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les expressions conditionnelles peuvent être utilisées dans les annotations, les agrégations, les recherches et les mises à jour. Elles peuvent également être combinées et imbriquées avec d’autres expressions. Cela permet d’effectuer des requêtes conditionnelles puissantes.</p>\n<section id=\"conditional-update\">\n<h3>Mise à jour conditionnelle<a class=\"heading-anchor\" href=\"#conditional-update\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Admettons que nous voulions modifier le type de compte <code class=\"docutils literal notranslate\"><span class=\"pre\">account_type</span></code> de nos clients pour qu’il corresponde aux dates d’enregistrement. Nous pouvons le faire à l’aide d’une expression conditionnelle et de la méthode <a class=\"reference internal\" href=\"/fr/1.9/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\"><span class=\"pre\">update()</span></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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_month_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_year_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</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\"># Update the account_type for each Client from the registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_year_ago</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>             <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_month_ago</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>             <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><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=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><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\">[(&#39;Jane Doe&#39;, &#39;G&#39;), (&#39;James Smith&#39;, &#39;R&#39;), (&#39;Jack Black&#39;, &#39;P&#39;)]</span>\n</code></pre></div>\n</section>\n<section id=\"conditional-aggregation\">\n<h3>Agrégation conditionnelle<a class=\"heading-anchor\" href=\"#conditional-aggregation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Et si nous voulions savoir combien de clients existent pour chaque type de compte ? Nous pouvons imbriquer une expression conditionnelle à l’intérieur de <a class=\"reference internal\" href=\"/fr/1.9/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">fonctions d’agrégation</span></a> pour pouvoir faire cela :</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><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Jean Grey&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;James Bond&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Jane Porter&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">IntegerField</span><span class=\"p\">,</span> <span class=\"n\">Sum</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">regular</span><span class=\"o\">=</span><span class=\"n\">Sum</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">Case</span><span class=\"p\">(</span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>             <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">IntegerField</span><span class=\"p\">())</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">gold</span><span class=\"o\">=</span><span class=\"n\">Sum</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">Case</span><span class=\"p\">(</span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>             <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">IntegerField</span><span class=\"p\">())</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">platinum</span><span class=\"o\">=</span><span class=\"n\">Sum</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">Case</span><span class=\"p\">(</span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>             <span class=\"n\">output_field</span><span class=\"o\">=</span><span class=\"n\">IntegerField</span><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=\"go\">{&#39;regular&#39;: 2, &#39;gold&#39;: 1, &#39;platinum&#39;: 3}</span>\n</code></pre></div>\n</section>\n</section>","rootId":"conditional-expressions","toc":[{"title":"Les classes d’expressions conditionnelles","anchor":"the-conditional-expression-classes","children":[{"title":"When","anchor":"when","children":[]},{"title":"Case","anchor":"case","children":[]}]},{"title":"Requêtes avancées","anchor":"advanced-queries","children":[{"title":"Mise à jour conditionnelle","anchor":"conditional-update","children":[]},{"title":"Agrégation conditionnelle","anchor":"conditional-aggregation","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/1.9/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/1.9/ref/models/"}],"prev":{"docname":"ref/models/expressions","title":"Expressions de requête","url":"/fr/1.9/ref/models/expressions/"},"next":{"docname":"ref/models/database-functions","title":"Fonctions de base de données","url":"/fr/1.9/ref/models/database-functions/"},"formats":{"html":"/fr/1.9/ref/models/conditional-expressions/","markdown":"/fr/1.9/ref/models/conditional-expressions.md","json":"/fr/1.9/ref/models/conditional-expressions.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/ref/models/conditional-expressions.txt","official":"https://docs.djangoproject.com/fr/1.9/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","fr","ja","id","pt-br","es"]}