{"title":"Référence de l’API QuerySet","version":"3.2","locale":"fr","docname":"ref/models/querysets","url":"/fr/3.2/ref/models/querysets/","canonical":"https://djangodocs.dev/fr/3.2/ref/models/querysets/","summary":"Ce document détaille l’API des objets QuerySet . Il augmente les contenus présentés dans les guides des modèles et des requêtes de base de données , il est donc…","html":"<h1>Référence de l’API <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#queryset-api-reference\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document détaille l’API des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Il augmente les contenus présentés dans les guides des <a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/\"><span class=\"doc\">modèles</span></a> et des <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/\"><span class=\"doc\">requêtes de base de données</span></a>, il est donc conseillé de lire et de comprendre ces derniers avant de lire celui-ci.</p>\n<p>Tout au long de cette référence, nous utiliserons les <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">modèles d’exemple Weblog</span></a> présentés dans le <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/\"><span class=\"doc\">guide des requêtes de base de données</span></a>.</p>\n<section id=\"when-querysets-are-evaluated\">\n<span id=\"id1\"></span><h2>Quand les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> sont évalués<a class=\"heading-anchor\" href=\"#when-querysets-are-evaluated\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En interne, un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> peut être construit, filtré, segmenté ou transmis sans devoir accéder à la base de données. Aucune activité de base de données n’est effectivement créée tant qu’une action ne provoque pas l’évaluation du jeu de requête.</p>\n<p>Un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est évalué dans les contextes suivants :</p>\n<ul>\n<li><p><strong>Itération.</strong> Un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est itérable, et il exécute sa requête de base de données lors de la première itération. Par exemple, ceci affiche le titre de tous les articles de la base de données :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">headline</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note : ne faites pas cela si vous voulez uniquement savoir s’il existe au moins un résultat. Il est plus efficace d’utiliser <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a>.</p>\n</li>\n<li><p><strong>Segmentation.</strong> Comme expliqué dans  <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#limiting-querysets\"><span class=\"std std-ref\">Limitation des QuerySet</span></a>, un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> peut être segmenté par la syntaxe de segmentation de liste de Python. La segmentation d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> non évalué renvoie habituellement un autre objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> non évalué, mais Django exécute la requête de base de données si vous employez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">step</span></code> de la syntaxe de segmentation, et dans ce cas, une liste est renvoyée. La segmentation d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui a été évalué renvoie également une liste.</p>\n<p>Notez également que bien que la segmentation d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> non évalué renvoie un autre <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> non évalué, sa modification ultérieure (par ex. par l’ajout de filtres ou en modifiant l’ordre de tri) n’est plus permise, car cela se traduirait difficilement en termes SQL et la signification d’une telle opération ne serait pas claire non plus.</p>\n</li>\n<li><p><strong>« Pickling »/mise en cache.</strong> Consultez la section suivante pour plus de détails sur les implications du <a class=\"reference internal\" href=\"#pickling-querysets\">« pickling » des objets QuerySets</a>. L’élément important dans la perspective de cette section est que les résultats sont lus à partir de la base de données.</p></li>\n<li><p><strong>repr().</strong> Un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est évalué lorsqu’on l’inclut dans un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">repr()</span></code>. Ceci pour des raisons pratiques dans l’interpréteur interactif Python, afin de pouvoir visualiser immédiatement les résultats en utilisant l’API de manière interactive.</p></li>\n<li><p><strong>len().</strong> Un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est évalué lorsqu’on l’inclut dans un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code>. Ceci renvoie comme prévu la longueur de la liste résultante.</p>\n<p>Note : si vous avez seulement besoin de connaître le nombre d’enregistrements du résultat (et que vous n’avez pas besoin des objets eux-mêmes), il est bien plus efficace de gérer la comptabilisation au niveau de la base de données en utilisant le code SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">COUNT(*)</span></code>. Django fournit une méthode <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">count()</span></code></a> précisément pour cette raison.</p>\n</li>\n<li><p><strong>list().</strong> Force l’évaluation d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> lorsqu’on l’inclut dans un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">list()</span></code>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">entry_list</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n</li>\n<li><p><strong>bool().</strong> Le test d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dans un contexte booléen, comme par exemple en employant <code class=\"docutils literal notranslate\"><span class=\"pre\">bool()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">or</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">and</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span></code>, va provoquer l’exécution de la requête. S’il existe au moins un résultat, le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> renverra <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, sinon <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">):</span>\n   <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one Entry with the headline Test&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note : si tout ce qui vous intéresse est de déterminer s’il existe au moins un résultat (et que vous n’avez pas besoin des objets eux-mêmes), il est plus efficace d’utiliser <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a>.</p>\n</li>\n</ul>\n<section id=\"pickling-querysets\">\n<span id=\"id2\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> et « pickling »<a class=\"heading-anchor\" href=\"#pickling-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous transformez un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> par <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a>, cela force tous les résultats à être chargés en mémoire avant le processus de pickling. Cette opération précède généralement une mise en cache, et lorsque le jeu de requête est récupéré du cache, il est souhaitable que les résultats soient disponibles et prêts à être utilisés (une lecture depuis la base de données peut prendre du temps, ce qui annulerait l’avantage du cache). Cela signifie que lorsqu’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est reconstruit depuis sa représentation « pickle », il contient les résultats du moment où il a été transformé par « pickle », et non pas les résultats du moment actuel en base de données.</p>\n<p>Si vous ne vouliez que mettre en « pickle » les informations utiles pour recréer le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> à partir de la base de données au moment voulu, fournissez à pickle l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Vous pouvez ensuite recréer le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> original (sans chargement des résultats) en écrivant du code semblable à ceci :</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\">import</span><span class=\"w\"> </span><span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">)</span>     <span class=\"c1\"># Assuming &#39;s&#39; is the pickled string.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">query</span>            <span class=\"c1\"># Restore the original &#39;query&#39;.</span>\n</code></pre></div>\n<p>L’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> est un objet opaque. Il constitue la représentation interne de la construction de la requête et ne fait pas partie de l’API publique. Cependant, la sérialisation et la désérialisation « pickle » du contenu de cet attribut est une opération sûre (et totalement acceptable).</p>\n<aside class=\"admonition-restrictions-on-queryset-values-list admonition\">\n<p class=\"admonition-title\">Restrictions avec <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.values_list()</span></code></p>\n<p>Si vous recréez <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.values_list()</span></code></a> en utilisant l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> sérialisé par « pickle », il sera converti en résultat <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.values()</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</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;id&#39;</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=\"n\">qs</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;Beatles Blog&#39;)]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span><span class=\"o\">.</span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">query</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-you-can-t-share-pickles-between-versions admonition\">\n<p class=\"admonition-title\">Il  n’est pas possible de partager des sérialisations « pickle » entre différentes versions</p>\n<p>Des sérialisations « pickle » de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code> ne sont valables que pour la version de Django utilisée pour les générer. Si vous produisez du contenu « pickle » avec une version N de Django, il n’y a aucune garantie que ce contenu soit lisible par une version N+1 de Django. La sérialisation « pickle » ne doit pas être utilisée dans le cadre d’une stratégie d’archivage à long terme.</p>\n<p>Comme des erreurs de compatibilité de pickle peuvent être difficiles à diagnostiquer, comme par exemple des objets silencieusement corrompus, un avertissement <code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeWarning</span></code> est produit si vous essayez de désérialiser un jeu de requête dans une version de Django différente de celle qui a été utilisée pour la sérialisation.</p>\n</aside>\n</section>\n</section>\n<section id=\"queryset-api\">\n<span id=\"id3\"></span><h2>API <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#queryset-api\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Voici la déclaration formelle d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet\">\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\">QuerySet</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</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\">query</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\">using</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\">hints</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Normalement, lorsqu’on manipule un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, on le fait en <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#chaining-filters\"><span class=\"std std-ref\">enchaînant des filtres</span></a>. Pour accomplir cela, la plupart des méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> renvoient de nouveaux objets <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Ces méthodes sont décrites en détails plus loin dans cette section.</p>\n<p>La classe <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> possède deux attributs publics qu’il est possible d’utiliser pour introspection :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.ordered\">\n<span class=\"sig-name descname\"><span class=\"pre\">ordered</span></span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.ordered\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> si le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est trié, c’est-à-dire qu’il comporte une clause <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> ou un tri par défaut au niveau du modèle. Sinon, la valeur est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.db\">\n<span class=\"sig-name descname\"><span class=\"pre\">db</span></span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.db\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La base de données utilisée si la requête est exécutée tout de suite.</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> existe pour que des sous-classes spécialisées puissent reconstruire l’état interne des requêtes. La valeur du paramètre est une représentation opaque de l’état de la requête et ne fait pas partie de l’API publique.</p>\n</aside>\n</dd></dl>\n\n<section id=\"methods-that-return-new-querysets\">\n<h3>Méthodes renvoyant de nouveaux <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#methods-that-return-new-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django fournit un grand nombre de méthodes d’affinage des <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui modifient soit le type de résultats renvoyés par le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> ou sa façon d’exécuter la requête SQL.</p>\n<section id=\"filter\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code><a class=\"heading-anchor\" href=\"#filter\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.filter\">\n<span class=\"sig-name descname\"><span class=\"pre\">filter</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.filter\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un nouveau <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> contenant les objets qui répondent aux paramètres de recherche donnés.</p>\n<p>Les paramètres de recherche (<code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>) doivent être dans le format décrit dans <a class=\"reference internal\" href=\"#id4\">Recherches dans les champs</a> ci-dessous. Plusieurs paramètres sont combinés via <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> dans l’instruction SQL sous-jacente.</p>\n<p>Si vous avez besoin d’exécuter des requêtes plus complexes (par exemple des requêtes contenant des instruction avec <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> (OU)), vous pouvez utiliser des <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">objets</span> <span class=\"pre\">Q</span></code></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">*args</span></code>).</p>\n</section>\n<section id=\"exclude\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code><a class=\"heading-anchor\" href=\"#exclude\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exclude\">\n<span class=\"sig-name descname\"><span class=\"pre\">exclude</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exclude\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un nouveau <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> contenant les objets qui ne répondent <em>pas</em> aux paramètres de recherche donnés.</p>\n<p>Les paramètres de recherche (<code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>) doivent être dans le format décrit dans <a class=\"reference internal\" href=\"#id4\">Recherches dans les champs</a> ci-dessous. Plusieurs paramètres sont combinés via <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> dans l’instruction SQL sous-jacente, et le tout est englobé dans un <code class=\"docutils literal notranslate\"><span class=\"pre\">NOT()</span></code>.</p>\n<p>Cet exemple exclut tous les éléments dont <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est postérieure à 2005-1-3 ET dont <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> contient « Hello » :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">),</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>En termes SQL, cela donne :</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=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-1-3&#39;</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cet exemple exclut tous les éléments dont <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est postérieure à 2005-1-3 OU dont <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> contient « Hello »</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>En termes SQL, cela donne :</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=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-1-3&#39;</span>\n<span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;Hello&#39;</span>\n</code></pre></div>\n<p>Notez que le second exemple est plus restrictif.</p>\n<p>Si vous avez besoin d’exécuter des requêtes plus complexes (par exemple des requêtes contenant des instruction avec <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> (OU)), vous pouvez utiliser des <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">objets</span> <span class=\"pre\">Q</span></code></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">*args</span></code>).</p>\n</section>\n<section id=\"annotate\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code><a class=\"heading-anchor\" href=\"#annotate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.annotate\">\n<span class=\"sig-name descname\"><span class=\"pre\">annotate</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.annotate\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Annote chaque objet du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> avec la liste fournie d”<a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/\"><span class=\"doc\">expressions de requêtes</span></a>. Une expression peut être une valeur simple, une référence à un champ du modèle (ou de tout modèle lié) ou une expression d’agrégation (moyennes, sommes, etc.) qui a été calculée sur les objets en liaison avec les objets du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Chaque paramètre d’<code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> est une annotation qui sera ajoutée à chaque objet du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> renvoyé.</p>\n<p>Les fonctions d’agrégation fournies par Django sont décrites plus loin dans <a class=\"reference internal\" href=\"#id5\">Fonctions d’agrégation</a>.</p>\n<p>Les annotations spécifiées par des paramètres nommés utilisent la clé comme alias d’annotation. Les paramètres anonymes seront dotés d’un alias généré automatiquement sur la base du nom de la fonction d’agrégation et du champ de modèle sur lequel porte l’agrégation. Seules les expressions d’agrégation qui font référence à un seul champ peuvent constituer des paramètres anonymes. Tout le reste doit se présenter sous la forme d’un paramètre nommé.</p>\n<p>Par exemple, si vous avez affaire à une liste de blogs, il peut être intéressant de déterminer le nombre d’articles écrits dans chaque blog :</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\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\"># The name of the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">name</span>\n<span class=\"go\">&#39;Blogasaurus&#39;</span>\n<span class=\"go\"># The number of entries on the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">entry__count</span>\n<span class=\"go\">42</span>\n</code></pre></div>\n<p>Le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> ne définit pas d’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">entry__count</span></code> par lui-même, mais en utilisant un paramètre nommé pour définir la fonction d’agrégation, vous pouvez contrôler le nom de l’annotation :</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\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">number_of_entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\"># The number of entries on the first blog, using the name provided</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">number_of_entries</span>\n<span class=\"go\">42</span>\n</code></pre></div>\n<p>Pour une présentation approfondie de l’agrégation, consultez le <a class=\"reference internal\" href=\"/fr/3.2/topics/db/aggregation/\"><span class=\"doc\">guide thématique sur l’agrégation</span></a>.</p>\n</section>\n<section id=\"alias\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code><a class=\"heading-anchor\" href=\"#alias\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alias\">\n<span class=\"sig-name descname\"><span class=\"pre\">alias</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alias\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"3.2\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>Semblable à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>, mais au lieu d’annoter les objets de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, enregistre l’expression pour être réutilisée avec d’autres méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Cela est utile lorsque le résultat de l’expression lui-même n’est pas utile au final, mais uniquement employé pour filtrer, trier ou comme faisant partie d’une expression complexe. Le fait de ne pas sélectionner cette valeur non utile enlève du travail redondant au niveau de la base de données et devrait aboutir à de meilleures performances.</p>\n<p>Par exemple, si vous souhaitez trouver des blogs avec mois de 5 articles, mais que le nombre exact d’articles ne vous intéresse pas, vous pourriez écrire ceci</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\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">blogs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">alias</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">entries__gt</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code> peut être utilisé conjointement avec <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a>, <a class=\"reference internal\" href=\"#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>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> et <a class=\"reference internal\" href=\"#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>. Pour utiliser une expression avec alias avec d’autres méthodes (par ex. <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code></a>), vous devez la promouvoir en tant qu’annotation</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">alias</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n    <span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;entries&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Sum</span><span class=\"p\">(</span><span class=\"s1\">&#39;entries&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#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> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> peuvent accepter directement des expressions, mais la construction et l’utilisation des expressions n’interviennent souvent pas à la même place (par exemple, la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> crée les expressions pour utilisation ultérieure dans les vues). <code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code> permet de construire des expressions complexes de manière incrémentale, recouvrant potentiellement plusieurs méthodes et modules, de se référer aux parties d’expression par leurs alias et d’utiliser uniquement <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> pour le résultat final.</p>\n</section>\n<section id=\"order-by\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code><a class=\"heading-anchor\" href=\"#order-by\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.order_by\">\n<span class=\"sig-name descname\"><span class=\"pre\">order_by</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.order_by\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Par défaut, les résultats renvoyés par un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> sont triés selon le tuple de tri défini par l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code> de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> du modèle. Vous pouvez surcharger cela pour chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> en utilisant la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code>.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les résultats ci-dessus seront triés par <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> dans l’ordre chronologique inverse, puis par <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> dans l’ordre alphabétique. Le signe moins devant <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;-pub_date&quot;</span></code> indique l”<em>inversion</em> de l’ordre de tri. Pour trier de manière aléatoire, utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;?&quot;</span></code> comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;?&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note : les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by('?')</span></code> peuvent être coûteuses et lentes, en fonction du moteur de base de données utilisé.</p>\n<p>Pour trier selon un champ d’un autre modèle, utilisez la même syntaxe que lorsque vous interrogez la base de données en traversant des relations. C’est-à-dire, le nom du champ suivi d’un double soulignement (<code class=\"docutils literal notranslate\"><span class=\"pre\">__</span></code>), suivi du nom du champ du nouveau modèle, et ainsi de suite pour autant de modèles que vous souhaitez combiner. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous essayez de trier selon un champ qui constitue une relation vers un autre modèle, Django utilise le tri par défaut du modèle lié, ou trie selon la clé primaire du modèle lié si aucun attribut <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.ordering</span></code></a> n’est présent. Par exemple, comme le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> ne possède par d’ordre de tri par défaut :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>… est identique à :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__id&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> comportait <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span> <span class=\"pre\">=</span> <span class=\"pre\">['name']</span></code>, alors le premier jeu de requête serait identique à :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il est aussi possible de trier par des <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/\"><span class=\"doc\">expressions de requête</span></a> en appelant <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">asc()</span></code></a> ou <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">desc()</span></code></a> sur l’expression :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"n\">Coalesce</span><span class=\"p\">(</span><span class=\"s1\">&#39;summary&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">desc</span><span class=\"p\">())</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">asc()</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">desc()</span></code></a> possèdent des paramètres (<code class=\"docutils literal notranslate\"><span class=\"pre\">nulls_first</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">nulls_last</span></code>) qui contrôlent la manière dont sont triées les valeurs nulles.</p>\n<p>Soyez prudent lorsque vous triez selon des champs de modèles liés et que vous utilisez également <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a>. Consultez la note dans <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> pour une explication sur l’impact possible du tri selon des modèles liés sur les résultats attendus.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Il est autorisé de définir un champ multivalué comme critère de tri (par exemple, un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> ou la relation inverse d’un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>).</p>\n<p>Considérez ce cas :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Event</span><span class=\"p\">(</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n   <span class=\"n\">parent</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n       <span class=\"s1\">&#39;self&#39;</span><span class=\"p\">,</span>\n       <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n       <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;children&#39;</span><span class=\"p\">,</span>\n   <span class=\"p\">)</span>\n   <span class=\"n\">date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;children__date&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dans ce cas, il est possible que plusieurs données de tri existent pour chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">Event</span></code>. Un <code class=\"docutils literal notranslate\"><span class=\"pre\">Event</span></code> avec plusieurs <code class=\"docutils literal notranslate\"><span class=\"pre\">children</span></code> sera renvoyé plusieurs fois dans le nouveau <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> créé par <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code>. En d’autres termes, l’application de <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> sur le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> peut renvoyer plus d’éléments que l’ensemble de départ, ce qui n’est ni le résultat attendu, ni utile.</p>\n<p>Ainsi, il faut être très prudent lorsqu’on utilise un champ multivalué pour trier des résultats. <strong>Si</strong> vous pouvez être certain qu’il n’y aura qu’une donnée de tri pour chaque élément que vous triez, cette approche ne devrait pas poser de problème. Dans le cas contraire, vérifiez soigneusement que les résultats correspondent à votre attente.</p>\n</aside>\n<p>Il n’est pas possible d’indiquer si le tri doit être sensible à la casse ou non. Dans cette optique, Django trie les résultats en fonction du comportement habituel de tri du moteur de base de données.</p>\n<p>Vous pouvez trier selon un champ converti en minuscules avec <a class=\"reference internal\" href=\"/fr/3.2/ref/models/database-functions/#django.db.models.functions.Lower\" title=\"django.db.models.functions.Lower\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lower</span></code></a>, ce qui aboutira à un tri insensible à la casse :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">desc</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>Si vous ne voulez pas qu’une requête soit triée, même pas selon le tri par défaut, appelez <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> sans paramètre.</p>\n<p>Vous pouvez savoir si une requête est triée ou pas en interrogeant l’attribut <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.ordered\" title=\"django.db.models.query.QuerySet.ordered\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">QuerySet.ordered</span></code></a>, qui vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> lorsque le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> a été trié d’une manière ou d’une autre.</p>\n<p>Chaque appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> efface tout ordre de tri préexistant. Par exemple, cette requête sera triée par <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> et non pas par <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Le tri n’est pas une opération anodine. Chaque champ ajouté dans les critères de tri implique un coût au niveau de la base de données. Chaque clé étrangère ajoutée inclut aussi implicitement tous ses champs de tri par défaut.</p>\n<p>Si une requête ne possède pas d’ordre de tri, les résultats sont renvoyés de la base de données dans un ordre non défini. Un ordre particulier ne peut être garanti que si l’ordre se base sur un ou des champs qui identifient chaque objet du résultat de manière unique. Par exemple, si un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">nom</span></code> n’est pas unique, le tri par ce champ ne garantit pas que les objets de même nom apparaissent toujours dans le même ordre.</p>\n</aside>\n</section>\n<section id=\"reverse\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code><a class=\"heading-anchor\" href=\"#reverse\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.reverse\">\n<span class=\"sig-name descname\"><span class=\"pre\">reverse</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.reverse\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Utilisez la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> pour inverser l’ordre dans lequel les éléments d’un jeu de requête sont renvoyés. En appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> une seconde fois, l’ordre est rétabli selon l’ordre initial normal.</p>\n<p>Pour récupérer les cinq « derniers » éléments d’un jeu de requête, vous pourriez écrire 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=\"n\">my_queryset</span><span class=\"o\">.</span><span class=\"n\">reverse</span><span class=\"p\">()[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Notez que ce n’est pas tout à fait la même chose que de segmenter à partir de la fin d’une liste en Python. L’exemple ci-dessus renvoie en premier le dernier élément, puis l’avant-dernier et ainsi de suite. Si nous avions une liste Python et que nous avions appliqué <code class=\"docutils literal notranslate\"><span class=\"pre\">list[-5:]</span></code>, nous aurions obtenu les 5 derniers éléments. Django ne prend pas en charge ce mode d’accès avec les jeux de requête (segmentation à partir de la fin), car il n’est pas possible de le faire efficacement en SQL.</p>\n<p>Signalons également que <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> ne devrait généralement être appelé que pour un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dont l’ordre de tri est défini (par exemple, lors d’une requête sur un modèle définissant un tri par défaut ou en appelant <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a>). Si un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> donné ne comporte pas d’ordre de tri, l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> sur cet objet n’a pas d’effet réel (le tri n’étant pas défini avant l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code>, il ne le sera pas plus après).</p>\n</section>\n<section id=\"distinct\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code><a class=\"heading-anchor\" href=\"#distinct\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.distinct\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un nouveau <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code> dans sa requête SQL. Les lignes dupliquées sont alors supprimées des résultats de la requête.</p>\n<p>Par défaut, un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> n’élimine pas les lignes dupliquées. En pratique, c’est rarement un problème, car les requêtes simples comme <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog.objects.all()</span></code> n’introduisent pas la possibilité de lignes de résultats dupliquées. Cependant, si la requête s’étend sur plusieurs tables, il est possible d’obtenir des résultats dupliqués lors de l’évaluation du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. C’est alors que <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> devient utile.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Tout champ mentionné dans un appel <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> est inclus dans les colonnes <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> de l’instruction SQL. Cela peut parfois amener à des résultats inattendus lors d’une utilisation conjointe avec <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code>. Si vous triez en fonction de champs d’un modèle lié, ces champs seront ajoutés aux colonnes sélectionnées et certaines lignes qui seraient normalement dupliquées (donc supprimées) apparaissent alors comme distinctes. Comme ces colonnes supplémentaires n’apparaissent pas dans les résultats renvoyés (elles ne servent qu’au tri), il peut sembler que des lignes dupliquées, non distinctes sont renvoyées malgré tout.</p>\n<p>De même, si vous utilisez une requête <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> pour limiter les colonnes sélectionnées, toute colonne mentionnée dans <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> (ou dans un tri par défaut d’un modèle) fera tout de même partie de la requête et pourrait interférer avec l’unicité des résultats.</p>\n<p>La morale à retenir est que si vous utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code>, vous devez rester prudent lors des tris selon des modèles liés. De même, lorsque vous combinez l’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> et de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>, soyez prudent avec les champs de tri qui ne figurent pas dans l’appel à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>.</p>\n</aside>\n<p>Avec PostgreSQL uniquement, vous pouvez transmettre des paramètres positionnels (<code class=\"docutils literal notranslate\"><span class=\"pre\">*fields</span></code>) afin de préciser les noms des champs sur lesquels l’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span></code> s’applique. Cela produit une requête SQL du genre <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code>. Voici la différence. Pour un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> normal, la base de données compare <em>chaque</em> champ de chaque ligne pour déterminer quelles lignes sont distinctes. Lors d’un appel <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> qui spécifie des noms de champs, la base de données ne compare que les champs indiqués pour déterminer les lignes distinctes.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Lorsque vous indiquez des noms de champs, vous <em>devez</em> fournir une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> pour le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, et les champs dans <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> doivent commencer par les champs de <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code>, dans le même ordre.</p>\n<p>Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span> <span class=\"pre\">(a)</span></code> renvoie la première ligne pour chaque valeur différente dans la colonne <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>. Si vous n’indiquez pas de tri, le choix de la ligne renvoyée est arbitraire.</p>\n</aside>\n<p>Exemples (à partir du deuxième exemple, cela ne fonctionne qu’avec PostgreSQL) :</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\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">()</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;author&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;author&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;mod_date&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;mod_date&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;author&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;author&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Gardez en tête que <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> utilise les éventuels ordres de tri par défaut définis pour les modèles liés. Il peut être nécessaire de trier explicitement selon le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">_id</span></code> de la relation ou selon le champ référencé pour s’assurer que les expressions <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code> correspondent à celles du début de la clause <code class=\"docutils literal notranslate\"><span class=\"pre\">ORDER</span> <span class=\"pre\">BY</span></code>. Par exemple, si le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> définit un tri <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ordering</span></code></a> selon son champ <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…ne fonctionnera pas car la requête serait triée par <code class=\"docutils literal notranslate\"><span class=\"pre\">blog__name</span></code> et ne correspondra donc pas à l’expression <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code>. Il faudrait trier explicitement selon le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">_id</span></code> de la relation (<code class=\"docutils literal notranslate\"><span class=\"pre\">blog_id</span></code> dans ce cas) ou selon le champ référencé (<code class=\"docutils literal notranslate\"><span class=\"pre\">blog__pk</span></code>) pour être certain que les deux expressions correspondent.</p>\n</aside>\n</section>\n<section id=\"values\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code><a class=\"heading-anchor\" href=\"#values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values\">\n<span class=\"sig-name descname\"><span class=\"pre\">values</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\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">expressions</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui renvoie des dictionnaires lorsqu’on l’utilise de manière itérable, au lieu d’instances de modèles.</p>\n<p>Chacun de ces dictionnaires représente un objet, les clés correspondant aux noms d’attributs des objets de modèle.</p>\n<p>Cet exemple compare les dictionnaires de <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> avec des objets de modèle normaux :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This list contains a Blog object.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Beatles&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Blog</span><span class=\"p\">:</span> <span class=\"n\">Beatles</span> <span class=\"n\">Blog</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># This list contains a dictionary.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Beatles&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[{</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Beatles Blog&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;tagline&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;All the latest Beatles news.&#39;</span><span class=\"p\">}]</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> accepte des paramètres positionnels facultatifs, <code class=\"docutils literal notranslate\"><span class=\"pre\">*fields</span></code>, qui définissent les noms de champs auxquels l’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> se limitera. Si vous renseignez ces paramètres, chaque dictionnaire du résultat ne contiendra que les clés/valeurs des champs qui ont été indiqués. Si aucun de ces paramètres n’est présent, chaque dictionnaire du résultat contiendra une clé et une valeur pour tous les champs de la table de base de données correspondante.</p>\n<p>Exemple :</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\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;, &#39;tagline&#39;: &#39;All the latest Beatles news.&#39;}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> accepte également des paramètres nommés facultatifs, <code class=\"docutils literal notranslate\"><span class=\"pre\">**expressions</span></code>, qui sont transmis par <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>:</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.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">lower_name</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;lower_name&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>Vous pouvez utiliser les requêtes intégrées ou <a class=\"reference internal\" href=\"/fr/3.2/howto/custom-lookups/\"><span class=\"doc\">personnalisées</span></a> dans les tris. Par exemple</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\">CharField</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">CharField</span><span class=\"o\">.</span><span class=\"n\">register_lookup</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;name__lower&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name__lower&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>Une agrégation à l’intérieur d’une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> est appliquée avant les autres paramètres dans la même clause. Si vous avez besoin de grouper selon une autre valeur, ajoutez-la plutôt à une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> précédente. Par exemple :</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\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors&#39;</span><span class=\"p\">,</span> <span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 20}, {&#39;entry__authors&#39;: 1, &#39;entries&#39;: 13}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n<p>Quelques subtilités qui valent la peine d’être mentionnées :</p>\n<ul>\n<li><p>Si un champ appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> est un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>, l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> par défaut renvoie une clé de dictionnaire nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">foo_id</span></code>, car il s’agit du nom interne de l’attribut de modèle stockant la valeur réelle (l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> se référant au modèle lié). Lorsque vous appelez <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> et que vous indiquez des noms de champs, vous pouvez mentionner <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">foo_id</span></code> et vous obtiendrez le même résultat (la clé de dictionnaire correspond au nom du champ que vous avez mentionné).</p>\n<p>Par exemple :</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1, &#39;headline&#39;: &#39;First Entry&#39;, ...}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog&#39;: 1}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog_id&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1}, ...]&gt;</span>\n</code></pre></div>\n</li>\n<li><p>Lors d’une utilisation combinée de <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> et de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a>, soyez conscient que le tri peut affecter les résultats. Consultez la note dans <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> pour plus de détails.</p></li>\n<li><p>Si vous utilisez une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> après un appel à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a>, tout champ mentionné dans un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a> doit être explicitement inclus dans l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>. Lors de tout appel à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a> après un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>, les champs sélectionnés supplémentaires sont ignorés.</p></li>\n<li><p>Les appels à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> après <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> n’ont pas de sens, et si vous le faites, vous obtiendrez une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError</span></code>.</p></li>\n<li><p>La combinaison de transformations et d’agrégats nécessite l’emploi de deux appels à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>, soit explicitement ou sous forme de paramètres nommés à meth:values. Comme ci-dessus, si la transformation a été inscrite pour le type de champ adéquat, le premier appel à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> peut être omis, ce qui signifie que les deux exemples suivants sont équivalents</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\">CharField</span><span class=\"p\">,</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">CharField</span><span class=\"o\">.</span><span class=\"n\">register_lookup</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors__name__lower&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">entry__authors__name__lower</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors__name&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</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\">entry__authors__name__lower</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors__name&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry__authors__name__lower&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n</li>\n</ul>\n<p>C’est utile lorsque vous savez que vous n’aurez besoin que d’un petit nombre des champs disponibles et que vous n’aurez pas besoin des fonctionnalités d’un objet d’instance de modèle. Il est plus efficace de ne sélectionner que les champs dont vous aurez besoin.</p>\n<p>Enfin, notez que vous pouvez appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code>, etc. après l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>, ce qui signifie que ces deux appels sont identiques :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Les concepteurs de Django préfèrent placer en premier les méthodes affectant le code SQL, suivies (facultativement) par toute méthode affectant le format (comme <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>), mais ce n’est pas essentiel. C’est l’occasion de mettre en évidence votre individualisme.</p>\n<p>Vous pouvez aussi faire référence à des modèles liés par des relations inverses au travers d’attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;entry__headline&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;An entry&#39;},</span>\n<span class=\"go\">     {&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;Another entry&#39;}, ...]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Comme les attributs <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> et les relations inverses peuvent posséder plusieurs lignes liées, leur inclusion peut produire un effet multiplicateur sur la taille du jeu de résultats. Et plus il y a de tels champs dans la requête <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>, plus l’effet est prononcé, car toutes les combinaisons possibles sont effectuées et renvoyées.</p>\n</aside>\n<aside class=\"admonition-boolean-values-for-jsonfield-on-sqlite admonition\">\n<p class=\"admonition-title\">Valeurs booléennes pour <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONField</span></code> avec SQLite</p>\n<p>En raison de l’implémentation par SQLite de la fonction SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_EXTRACT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> pour les transformations de clés <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"values-list\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code><a class=\"heading-anchor\" href=\"#values-list\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values_list\">\n<span class=\"sig-name descname\"><span class=\"pre\">values_list</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\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">flat</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">named</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values_list\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Semblable à <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>, sauf qu’au lieu de renvoyer des dictionnaires, ce sont des tuples qui sont renvoyés lors de l’itération des résultats. Chaque tuple contient les valeurs des champs ou expressions dans la position respective de leur apparition dans l’appel à  <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> — premier champ comme premier élément, etc. Par exemple :</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\">Entry</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;id&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;First entry&#39;), ...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</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;id&#39;</span><span class=\"p\">,</span> <span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;first entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>Si vous n’indiquez qu’un seul champ, il est aussi possible d’indiquer le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">flat</span></code>. S’il vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, cela signifie que les résultats renvoyés sont des valeurs uniques au lieu de tuples simples. Cet exemple devrait éclairer la différence :</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\">Entry</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;id&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet[(1,), (2,), (3,), ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</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;id&#39;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [1, 2, 3, ...]&gt;</span>\n</code></pre></div>\n<p>C’est une erreur d’indiquer le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">flat</span></code> lorsqu’il y a plus d’un champ.</p>\n<p>Vous pouvez passer <code class=\"docutils literal notranslate\"><span class=\"pre\">named=True</span></code> pour obtenir les résultats sous forme de <a class=\"reference external\" href=\"https://docs.python.org/3/library/collections.html#collections.namedtuple\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">namedtuple()</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\">Entry</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;id&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">,</span> <span class=\"n\">named</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [Row(id=1, headline=&#39;First entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>L’emploi d’un tuple nommé peut rendre les résultats plus lisibles, aux dépends d’une petite perte de performance pour la transformation des résultats en tuple nommé.</p>\n<p>Si vous n’indiquez aucune valeur dans <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code>, tous les champs du modèle sont pris en compte dans le résultat, dans leur ordre de déclaration.</p>\n<p>Un besoin fréquent est d’obtenir une valeur de champ spécifique d’une certaine instance de modèle. Pour faire cela, utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> suivie d’un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</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;headline&#39;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;First entry&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> doivent toutes deux être considérées comme des optimisations pour un cas d’utilisation spécifique : récupérer un sous-ensemble de données sans la surcharge de création des instances de modèles. Cette métaphore ne vaut plus lorsqu’on a affaire à des relations plusieurs-à-plusieurs ou multivaluées d’une autre manière. (comme la relation un-à-plusieurs d’une clé étrangère inverse) car la supposition « une ligne, un objet » ne tient plus.</p>\n<p>Par exemple, remarquez le comportement lorsqu’une requête traverse un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</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\">Author</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;entry__headline&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;, &#39;Impressions of Gaza&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;Why Socialists Do Not Believe in Fun&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;In Defence of English Cooking&#39;),</span>\n<span class=\"go\"> (&#39;Don Quixote&#39;, None)]&gt;</span>\n</code></pre></div>\n<p>Les auteurs avec plusieurs <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> apparaissent plusieurs fois et les auteurs sans <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> possèdent <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> comme valeur de ce champ.</p>\n<p>De la même façon, lors d’une requête par clé étrangère inverse, <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> apparaît pour les entrées sans auteur :</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\">Entry</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;authors&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;,), (&#39;George Orwell&#39;,), (None,)]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-boolean-values-for-jsonfield-on-sqlite admonition\">\n<p class=\"admonition-title\">Valeurs booléennes pour <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONField</span></code> avec SQLite</p>\n<p>En raison de l’implémentation par SQLite de la fonction SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_EXTRACT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> pour les transformations de clés <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"dates\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">dates()</span></code><a class=\"heading-anchor\" href=\"#dates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.dates\">\n<span class=\"sig-name descname\"><span class=\"pre\">dates</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">kind</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'ASC'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.dates\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dont l’évaluation produit une liste d’objets <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code></a> représentant toutes les dates disponibles d’un type particulier dans le contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> doit être le nom d’un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> du modèle. <code class=\"docutils literal notranslate\"><span class=\"pre\">kind</span></code> doit être soit <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;year&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;month&quot;</span></code>,  <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;week&quot;</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code>. Chaque objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code></a> de la liste de résultats est « tronqué » selon le <code class=\"docutils literal notranslate\"><span class=\"pre\">type</span></code> donné.</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;year&quot;</span></code> renvoie une liste de toutes les valeurs d’années distinctes pour le champ.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;month&quot;</span></code> renvoie une liste de toutes les valeurs d’années/mois distinctes pour le champ.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;week&quot;</span></code> renvoie une liste de toutes les valeurs d’années/semaines distinctes pour le champ. Toutes les dates sont un lundi.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code> renvoie une liste de toutes les valeurs d’années/mois/jours distinctes pour le champ.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">order</span></code>, dont la valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code>, doit contenir soit <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code> (chronologique), soit <code class=\"docutils literal notranslate\"><span class=\"pre\">'DESC'</span></code> (chronologique inverse). Cela indique comment trier les résultats.</p>\n<p>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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;year&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 1, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;month&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;week&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 14), datetime.date(2005, 3, 14)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;day&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 20), datetime.date(2005, 3, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;day&#39;</span><span class=\"p\">,</span> <span class=\"n\">order</span><span class=\"o\">=</span><span class=\"s1\">&#39;DESC&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20), datetime.date(2005, 2, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;day&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20)]</span>\n</code></pre></div>\n</section>\n<section id=\"datetimes\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">datetimes()</span></code><a class=\"heading-anchor\" href=\"#datetimes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.datetimes\">\n<span class=\"sig-name descname\"><span class=\"pre\">datetimes</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">kind</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'ASC'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tzinfo</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\">is_dst</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.datetimes\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dont l’évaluation produit une liste d’objets <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.datetime</span></code></a> représentant toutes les dates disponibles d’un type particulier dans le contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> doit correspondre au nom d’un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code> de votre modèle.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">kind</span></code> doit être soit <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;year&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;month&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;week&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;hour&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;minute&quot;</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;second&quot;</span></code>. Chaque objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.datetime</span></code></a> de la liste de résultats est « tronqué » selon le <code class=\"docutils literal notranslate\"><span class=\"pre\">type</span></code> donné.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">order</span></code>, dont la valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code>, doit contenir soit <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code> (chronologique), soit <code class=\"docutils literal notranslate\"><span class=\"pre\">'DESC'</span></code> (chronologique inverse). Cela indique comment trier les résultats.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code> définit le fuseau horaire dans lequel les dates/heures sont converties avant leur troncature. En effet, un date/heure peut être représentée différemment en fonction du fuseau horaire actif. Ce paramètre doit être un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.tzinfo</span></code></a>. S’il vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, Django utilise le <a class=\"reference internal\" href=\"/fr/3.2/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">fuseau horaire actuel</span></a>. Il n’a aucun effet lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst</span></code> indique si <code class=\"docutils literal notranslate\"><span class=\"pre\">pytz</span></code> doit interpréter les heures non existantes et ambiguës dans les transitions de changements d’heures saisonniers. Par défaut (lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst=None</span></code>), <code class=\"docutils literal notranslate\"><span class=\"pre\">pytz</span></code> génère une exception pour de telles heures.</p>\n<aside class=\"version-note version-added\" data-version=\"3.1\">\n<p class=\"version-note-title\">New in Django 3.1</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst</span></code> a été ajouté.</p>\n</aside>\n<aside class=\"admonition admonition-note\" id=\"database-time-zone-definitions\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Cette fonction effectue la conversion de fuseau horaire directement dans la base de données. En conséquence, la base de données doit être capable d’interpréter la valeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo.tzname(None)</span></code>. Cela se traduit dans les exigences suivantes :</p>\n<ul class=\"simple\">\n<li><p>SQLite : pas d’exigences. Les conversions sont effectuées en Python avec <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> (installé en même temps que Django).</p></li>\n<li><p>PostgreSQL : aucune exigence (voir <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-TIMEZONES\">Fuseaux horaires</a>).</p></li>\n<li><p>Oracle : aucune exigence (voir <a class=\"reference external\" href=\"https://docs.oracle.com/en/database/oracle/oracle-database/18/nlspg/datetime-data-types-and-time-zone-support.html#GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF\">Choix d’un fichier de fuseaux horaires</a>).</p></li>\n<li><p>MySQL : chargement des tables de fuseaux horaires avec <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html\">mysql_tzinfo_to_sql</a>.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"none\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">none()</span></code><a class=\"heading-anchor\" href=\"#none\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.none\">\n<span class=\"sig-name descname\"><span class=\"pre\">none</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.none\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>L’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">none()</span></code> crée un jeu de requête qui ne renvoie jamais aucun objet et qui ne génère pas de requête lorsqu’on accède à ses résultats. Un jeu de requête <code class=\"docutils literal notranslate\"><span class=\"pre\">qs.none()</span></code> est une instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">EmptyQuerySet</span></code>.</p>\n<p>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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.query</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">EmptyQuerySet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">(),</span> <span class=\"n\">EmptyQuerySet</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"all\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code><a class=\"heading-anchor\" href=\"#all\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.all\">\n<span class=\"sig-name descname\"><span class=\"pre\">all</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.all\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie une <em>copie</em> du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> actuel (ou d’une sous-classe <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>). Cela peut être utile dans les situations où il peut être possible de recevoir soit un gestionnaire de modèle, soit un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, et que les résultats doivent passer encore par d’autres filtres. Après avoir appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code> sur l’un des types d’objet, vous obtenez dans tous les cas un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> en retour.</p>\n<p>Lorsqu’un résultat <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> est <a class=\"reference internal\" href=\"#when-querysets-are-evaluated\"><span class=\"std std-ref\">évalué</span></a>, il met normalement ses résultats en cache. Si les données dans la base de données peuvent avoir été modifiées depuis l’évaluation d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, vous pouvez obtenir des résultats mis à jour de la même requête en appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code> sur un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> déjà évalué.</p>\n</section>\n<section id=\"union\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">union()</span></code><a class=\"heading-anchor\" href=\"#union\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.union\">\n<span class=\"sig-name descname\"><span class=\"pre\">union</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\">other_qs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">all</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.union\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Utilise l’opérateur SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">UNION</span></code> pour combiner les résultats de deux <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> ou plus. Par exemple :</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\">qs1</span><span class=\"o\">.</span><span class=\"n\">union</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’opérateur <code class=\"docutils literal notranslate\"><span class=\"pre\">UNION</span></code> ne sélectionne que les valeurs distinctes par défaut. Pour autoriser des valeurs dupliquées, utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">all=True</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">union()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">intersection()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">difference()</span></code> renvoient des instances de modèles du type du premier jeu de requête, même si les paramètres sont des jeux de requête d’autres modèles. Il est possible de transmettre des modèles différents pour autant que la liste de <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> soit la même pour tous les jeux de requête (au moins les types, les noms n’étant pas un problème si les types correspondent dans le même ordre). Dans de telles situations, vous devez utiliser les noms de colonnes du premier jeu de requête dans les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> appliquées au résultat obtenu. Par exemple</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\">qs1</span> <span class=\"o\">=</span> <span class=\"n\">Author</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>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs2</span> <span class=\"o\">=</span> <span class=\"n\">Entry</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;headline&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span><span class=\"o\">.</span><span class=\"n\">union</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>De plus, seules les opérations <code class=\"docutils literal notranslate\"><span class=\"pre\">LIMIT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">OFFSET</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">COUNT(*)</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ORDER</span> <span class=\"pre\">BY</span></code> et les indications de colonnes (c’est-à-dire la segmentation, le compte <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">count()</span></code></a>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a>, le tri <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>/<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values_list()</span></code></a>) sont autorisés sur le jeu de requête résultant. D’autre part, les bases de données définissent des restrictions quant aux opérations autorisées dans les requêtes combinées. Par exemple, la plupart des bases de données ne permettent pas les instructions <code class=\"docutils literal notranslate\"><span class=\"pre\">LIMIT</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">OFFSET</span></code> dans les requêtes combinées.</p>\n</section>\n<section id=\"intersection\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">intersection()</span></code><a class=\"heading-anchor\" href=\"#intersection\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.intersection\">\n<span class=\"sig-name descname\"><span class=\"pre\">intersection</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\">other_qs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.intersection\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Utilise l’opérateur SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">INTERSECT</span></code> pour renvoyer les éléments communs à deux ou plusieurs <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Par exemple :</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\">qs1</span><span class=\"o\">.</span><span class=\"n\">intersection</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">union()</span></code></a> concernant quelques restrictions.</p>\n</section>\n<section id=\"difference\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">difference()</span></code><a class=\"heading-anchor\" href=\"#difference\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.difference\">\n<span class=\"sig-name descname\"><span class=\"pre\">difference</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\">other_qs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.difference\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Utilise l’opérateur SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">EXCEPT</span></code> pour ne conserver que les éléments présents dans un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> mais pas dans d’autres <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Par exemple :</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\">qs1</span><span class=\"o\">.</span><span class=\"n\">difference</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">union()</span></code></a> concernant quelques restrictions.</p>\n</section>\n<section id=\"select-related\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code><a class=\"heading-anchor\" href=\"#select-related\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_related\">\n<span class=\"sig-name descname\"><span class=\"pre\">select_related</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_related\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui « suit » les relations de clé étrangère, sélectionnant les données supplémentaires d’éventuels objets liés au moment d’exécuter la requête. Il s’agit d’une optimisation en performances qui produit une requête unique plus complexe, mais qui évite ensuite de générer de nouvelles requêtes en base de données au moment d’accéder aux liaisons de clé étrangère.</p>\n<p>Les exemples suivants illustrent la différence entre les requêtes simples et les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code>. Voici la requête standard :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Hits the database again to get the related Blog object.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span>\n</code></pre></div>\n<p>Et voici la requête <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Doesn&#39;t hit the database, because e.blog has been prepopulated</span>\n<span class=\"c1\"># in the previous query.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span>\n</code></pre></div>\n<p>Vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> avec n’importe quel jeu de requête d’objets :</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.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n\n<span class=\"c1\"># Find all the blogs with entries scheduled to be published in the future.</span>\n<span class=\"n\">blogs</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">()</span>\n\n<span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Without select_related(), this would make a database query for each</span>\n    <span class=\"c1\"># loop iteration in order to fetch the related blog for each entry.</span>\n    <span class=\"n\">blogs</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’ordre dans lequel sont enchaînés <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> n’est pas significatif. Ces jeux de requête sont équivalents :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>Vous pouvez suivre les clés étrangères de la même manière que dans les requêtes. Si vous avez les modèles suivants :</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\">City</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=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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=\"c1\"># ...</span>\n    <span class=\"n\">hometown</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">City</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">SET_NULL</span><span class=\"p\">,</span>\n        <span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>… un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.select_related('author__hometown').get(id=4)</span></code> mettra en cache l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> lié <em>et</em> l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">City</span></code> lié :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database with joins to the author and hometown tables.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;author__hometown&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n<span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">author</span>         <span class=\"c1\"># Doesn&#39;t hit the database.</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">hometown</span>       <span class=\"c1\"># Doesn&#39;t hit the database.</span>\n\n<span class=\"c1\"># Without select_related()...</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>  <span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">author</span>         <span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">hometown</span>       <span class=\"c1\"># Hits the database.</span>\n</code></pre></div>\n<p>Vous pouvez faire référence à toute relation <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> ou <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> dans la liste des champs transmis à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code>.</p>\n<p>Il est également possible de se référer à la liaison inverse d’un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> dans la liste des champs transmis à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> — c’est-à-dire qu’il est possible d’accéder à un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> depuis les deux côtés de la relation, et non seulement depuis l’objet dans lequel il est défini. Au lieu d’indiquer le nom du champ, il faut alors utiliser le nom <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> du champ à partir de l’objet lié.</p>\n<p>Dans certaines situations, il peut être souhaitable d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> avec beaucoup d’objets liés ou avec des relations qu’on ne connaît pas d’avance. Dans ce cas, il est possible d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> sans paramètre. Toutes les relations de clé étrangère non nulles seront suivies, mais les clés étrangères pouvant être nulles doivent être indiquées explicitement. Ce n’est pas recommandé dans la plupart des cas car par rapport aux besoins réels, la requête sous-jacente sera certainement plus complexe et les données récupérées plus nombreuses.</p>\n<p>Si vous avez besoin d’effacer la liste des champs liés ajoutée par de précédents appels à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> sur un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, vous pouvez passer <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> comme paramètre :</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\">without_relations</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’enchaînement d’appels à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> fonctionne de manière semblable à d’autres méthodes, c’est-à-dire que <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related('foo',</span> <span class=\"pre\">'bar')</span></code> est équivalent à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related('foo').select_related('bar')</span></code>.</p>\n</section>\n<section id=\"prefetch-related\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code><a class=\"heading-anchor\" href=\"#prefetch-related\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.prefetch_related\">\n<span class=\"sig-name descname\"><span class=\"pre\">prefetch_related</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\">lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.prefetch_related\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui récupère automatiquement en une seule étape les objets liés de chacune des requêtes spécifiées.</p>\n<p>L’objectif est semblable à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code>, dans l’idée que les deux méthodes sont conçues pour prévenir le déluge de requêtes de base de données provoqué par l’accès aux objets liés, mais la stratégie est totalement différente.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> fonctionne en créant une jointure SQL et en incluant les champs de l’objet lié dans l’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>. Pour cette raison, <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> récupère les objets liés dans la même requête de base de données. Cependant, pour éviter le jeu de requête bien plus grand qui résulterait de jointures par des liaisons « plusieurs », <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> se limite aux relations univaluées, les clés étrangères et les liaisons un-à-un.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code>, de son côté, effectue une requête séparée pour chaque relation et procède à la réconciliation des données dans le code Python. Cela lui permet de précharger les objets plusieurs-à-plusieurs et plusieurs-à-un, ce qui n’est pas possible avec <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code>, en plus des liaisons de clé étrangère et un-à-un qui sont prises en charge par <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code>. Il permet également de précharger les liaisons <a class=\"reference internal\" href=\"/fr/3.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a>. Cependant, il doit être limité à un jeu de résultats homogène. Par exemple, le préchargement d’objets référencés par une clé <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> n’est pris en charge qu’à la condition que la requête soit limitée à un seul type <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>.</p>\n<p>Par exemple, supposons que vous ayez ces modèles :</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\">Topping</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Pizza</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">toppings</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Topping</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> (</span><span class=\"si\">%s</span><span class=\"s2\">)&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">topping</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">topping</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()),</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>et que vous exécutez :</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\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">[&quot;Hawaiian (ham, pineapple)&quot;, &quot;Seafood (prawns, smoked salmon)&quot;...</span>\n</code></pre></div>\n<p>Le problème de ce code est que chaque fois que <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.__str__()</span></code> fait appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code>, il doit interroger la base de données, ce qui fait que <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.objects.all()</span></code> lance une requête sur la table <code class=\"docutils literal notranslate\"><span class=\"pre\">Toppings</span></code> pour <strong>chaque</strong> objet du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> des pizzas.</p>\n<p>Nous pouvons réduire cela à deux seules requêtes en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cette syntaxe sous-entend que <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code> est demandé pour chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code>; dès cet instant, chaque fois que <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code> est appelé, au lieu de recourir à la base de données pour obtenir les objets, Django les retrouve dans un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> préchargé en cache qui a été rempli par une seule requête.</p>\n<p>C’est-à-dire que tous les <code class=\"docutils literal notranslate\"><span class=\"pre\">Toppings</span></code> appropriés auront été récupérés par une seule requête et qu’ils auront été utilisés pour créer des <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dont le cache est prérempli par les résultats appropriés ; ces <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> sont ensuite exploités lors des appels à <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code>.</p>\n<p>Les requêtes supplémentaires dans <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> sont exécutées après que le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> a commencé à être évalué et que la requête de base a été exécutée.</p>\n<p>Si vous disposez d’une série d’instances de modèles, vous pouvez précharger les attributs liés de ces instances en utilisant la fonction <a class=\"reference internal\" href=\"#django.db.models.prefetch_related_objects\" title=\"django.db.models.prefetch_related_objects\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code></a>.</p>\n<p>Notez que le cache des résultats du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> principal et tous les objets liés visés sera alors complètement chargé en mémoire. Cela change du comportement habituel des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui essaient autant que possible de ne pas charger tous les objets en mémoire tant qu’ils ne sont pas nécessaires, même après qu’une première requête a été exécutée en base de données.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Rappelez-vous que comme toujours avec les <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, toute méthode s’enchaînant ultérieurement et impliquant une requête de base de données différente ignore les résultats précédents du cache, et actualise les données par une nouvelle requête en base de données. Ainsi, si vous écrivez ceci :</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\">pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;toppings&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">spicy</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span> <span class=\"k\">for</span> <span class=\"n\">pizza</span> <span class=\"ow\">in</span> <span class=\"n\">pizzas</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>…le fait que <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.all()</span></code> a été préchargé ne vous aidera pas. <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related('toppings')</span></code> sous-entend <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.all()</span></code>, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.filter()</span></code> est une nouvelle et différente requête. Le cache préchargé ne vous aide en rien ici. Il s’agit même d’une perte de performances, car vous avez généré une requête de base de données qui ne sera pas utilisée. Ceci montre qu’il faut utiliser cette fonctionnalité avec prudence !</p>\n<p>D’autre part, si vous appelez les méthodes modifiant la base de données <a class=\"reference internal\" href=\"/fr/3.2/ref/models/relations/#django.db.models.fields.related.RelatedManager.add\" title=\"django.db.models.fields.related.RelatedManager.add\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add()</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.2/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove\" title=\"django.db.models.fields.related.RelatedManager.remove\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove()</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.2/ref/models/relations/#django.db.models.fields.related.RelatedManager.clear\" title=\"django.db.models.fields.related.RelatedManager.clear\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clear()</span></code></a> ou <a class=\"reference internal\" href=\"/fr/3.2/ref/models/relations/#django.db.models.fields.related.RelatedManager.set\" title=\"django.db.models.fields.related.RelatedManager.set\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set()</span></code></a> sur des <a class=\"reference internal\" href=\"/fr/3.2/ref/models/relations/#django.db.models.fields.related.RelatedManager\" title=\"django.db.models.fields.related.RelatedManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">gestionnaires</span> <span class=\"pre\">de</span> <span class=\"pre\">liaison</span></code></a>, tout cache de préchargement sur la relation sera effacé.</p>\n</aside>\n<p>Il est aussi possible d’utiliser la syntaxe de jointure normale pour se référer à des champs liés de champs liés. Supposons qu’un modèle supplémentaire est ajouté à l’exemple précédent :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Restaurant</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\">pizzas</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Pizza</span><span class=\"p\">,</span> <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;restaurants&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">best_pizza</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Pizza</span><span class=\"p\">,</span> <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;championed_by&#39;</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Toutes les expressions suivantes sont admises :</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\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cela va précharger toutes les pizzas appartenant aux restaurants ainsi que toutes les garnitures (<code class=\"docutils literal notranslate\"><span class=\"pre\">toppings</span></code>) de ces pizzas. Au total, 3 requêtes de base de données seront générées : une pour les restaurants, une pour les pizzas et une pour les garnitures.</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\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cette requête récupère la meilleure pizza et toutes les garnitures de la meilleure pizza de chaque restaurant. Cela se fera en 3 requêtes de base de données, une pour les restaurants, une pour les « meilleures pizzas » et une pour les garnitures.</p>\n<p>La relation <code class=\"docutils literal notranslate\"><span class=\"pre\">best_pizza</span></code> pourrait aussi être récupérée par <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> pour réduire le nombre de requêtes à 2 :</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\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Comme le préchargement a lieu après la requête principale (qui inclut les jointures requises par <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code>), il est capable de détecter que les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">best_pizza</span></code> ont déjà été récupérés, et il évitera de les récupérer une fois de plus.</p>\n<p>L’enchaînement d’appels à <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> accumule les liaisons à précharger. Pour effacer tout comportement lié à  <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code>, passez <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> en paramètre :</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\">non_prefetched</span> <span class=\"o\">=</span> <span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Une différence à signaler lors de l’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> est que les objets créés par une requête peuvent être partagés entre les différents objets auxquels ils sont liés, c’est-à-dire qu’une même instance de modèle Python peut apparaître à plus d’un endroit dans l’arborescence des objets renvoyés. Cela se produit normalement avec les relations de clé étrangère. Ce comportement ne pose généralement pas de problème et permet d’économiser à la fois de la mémoire et du temps processeur.</p>\n<p>Même si <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> prend en charge le préchargement des relations <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code>, le nombre de requêtes dépend des données. Comme un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> peut référencer des données de tables différentes, il sera nécessaire d’effectuer une requête par table référencée, au lieu d’une seule requête pour tous les éléments. Il pourrait aussi y avoir des requêtes supplémentaires pour la table <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code> si les lignes concernées n’ont pas déjà été obtenues.</p>\n<p>Dans la plupart des cas, <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> est implémenté par une requête SQL utilisant l’opérateur « IN ». Cela implique que pour un grand <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, cela peut générer une grande clause « IN », ce qui, en fonction de la base de données, peut poser en soi des problèmes de performance au moment d’analyser ou d’exécuter la requête SQL. Évaluez toujours les performances en fonction de votre cas d’utilisation !</p>\n<p>Notez que si vous utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> pour parcourir la requête, les appels <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> sont ignorés car il n’est pas logique de combiner ces deux optimisations.</p>\n<p>Vous pouvez utiliser l’objet <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code></a> pour contrôler de manière plus fine l’opération de préchargement.</p>\n<p>Dans sa forme la plus simple, <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code> est équivalent aux recherches traditionnelles basées sur les chaînes :</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\">Prefetch</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Vous pouvez préciser un jeu de requête personnalisé par le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code>. Cela peut par exemple être utilisé pour modifier l’ordre de tri par défaut du jeu de requête :</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\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>Ou pour appeler <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> lorsque c’est nécessaire afin de réduire encore plus le nombre de requêtes :</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\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;restaurants&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza&#39;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>Vous pouvez aussi attribuer le résultat du préchargement à un attribut personnalisé au moyen du paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code>. Le résultat sera directement stocké dans une liste.</p>\n<p>Cela permet de précharger plusieurs fois la même relation avec un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> différent ; par exemple :</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\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;menu&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">vegetarian_pizzas</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_menu&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Les recherches créées avec un paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> personnalisé peuvent toujours être traversées comme de coutume par d’autres recherches :</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\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">vegetarian_pizzas</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_menu&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"s1\">&#39;vegetarian_menu__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> est recommandée lors d’un filtrage restrictif du résultat préchargé car c’est moins ambigu que de stocker un résultat filtré dans le cache du gestionnaire de liaison :</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\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_pizzas&#39;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">restaurants</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">vegetarian_pizzas</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Not recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">restaurants</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">pizzas</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Le préchargement personnalisé fonctionne aussi avec des liaisons avant simples telles que des relations <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code>. Généralement, il faut plutôt utiliser <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> pour de telles relations, mais il existe certaines situations où le préchargement avec un jeu <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> personnalisé est utile :</p>\n<ul>\n<li><p>Vous souhaitez utiliser un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> qui effectue lui aussi un préchargement sur des modèles liés.</p></li>\n<li><p>Vous souhaitez précharger uniquement un sous-ensemble d’objets liés.</p></li>\n<li><p>Vous souhaitez utiliser des techniques d’optimisation de performances comme les <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">champs</span> <span class=\"pre\">différés</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\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">))</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Lors de l’utilisation de plusieurs bases de données, <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code> respecte votre choix de base de données. Si la requête interne ne suggère pas de base de données, ce sera la base de données choisie pour la requête externe qui sera utilisée. Toutes les expressions suivantes sont valables</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\"># Both inner and outer queries will use the &#39;replica&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;replica&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;replica&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use the &#39;replica&#39; database; outer will use &#39;default&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;replica&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use &#39;replica&#39; database; outer will use &#39;cold-storage&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;replica&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;cold-storage&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>L’ordre des recherches a son importance.</p>\n<p>Prenez les exemples suivants :</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\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cela fonctionne même si les paramètres sont dans le désordre, parce que <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas__toppings'</span></code> contient déjà toutes les informations nécessaires, et le second paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas'</span></code> est donc redondant.</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\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()))</span>\n</code></pre></div>\n<p>Cette ligne génère une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> en raison de la tentative de redéfinition du jeu de requête d’une recherche précédente. Notez qu’un jeu de requête implicite a été créé pour traverser <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas'</span></code> dans le cadre de la recherche <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas__toppings'</span></code>.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizza_list__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;pizza_list&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Cette ligne génère une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code> car <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizza_list'</span></code> n’existe pas encore au moment où <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizza_list__toppings'</span></code> est traité.</p>\n<p>Ces considérations ne sont pas limitées à l’utilisation des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code>. Certaines techniques avancées peuvent nécessiter que les recherches soient effectuées dans un ordre précis pour éviter de créer des requêtes supplémentaires ; il est donc recommandé de toujours positionner soigneusement les paramètres de <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code>.</p>\n</aside>\n</section>\n<section id=\"extra\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code><a class=\"heading-anchor\" href=\"#extra\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.extra\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">select</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\">where</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\">params</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\">tables</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\">order_by</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\">select_params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.extra\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Il peut arriver parfois que la syntaxe de requête de Django ne puisse pas exprimer facilement une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> complexe. Pour ces cas extrêmes, Django fournit le modificateur de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>, un point d’entrée pour injecter des clauses spécifiques dans le code SQL généré par un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<aside class=\"admonition-use-this-method-as-a-last-resort admonition\">\n<p class=\"admonition-title\">N’utilisez cette méthode qu’en dernier recours</p>\n<p>Il s’agit d’une ancienne API que nous prévoyons de rendre obsolète à un moment donné. Ne l’utilisez que si vous ne pouvez pas exprimer votre requête en employant d’autres méthodes de jeux de requêtes. Si vous êtes contraint de l’utiliser, <a class=\"reference external\" href=\"https://code.djangoproject.com/newticket\">créez un ticket</a> en indiquant le mot-clé <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=assigned&amp;status=new&amp;keywords=~QuerySet.extra\">QuerySet.extra</a> et en présentant votre cas d’utilisation (sans oublier de vérifier d’abord d’éventuels tickets existants) afin que nous puissions améliorer l’API QuerySet pour finalement supprimer <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>. Nous n’améliorons ni ne corrigeons plus de bogues pour cette dernière méthode.</p>\n<p>Par exemple, cette utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;val&#39;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">},</span>\n<span class=\"gp\">... </span>    <span class=\"n\">select_params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">someparam</span><span class=\"p\">,),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>est équivalent à :</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\">qs</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">val</span><span class=\"o\">=</span><span class=\"n\">RawSQL</span><span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">someparam</span><span class=\"p\">,)))</span>\n</code></pre></div>\n<p>Le principal avantage d’utiliser <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a> est qu’il est possible de définir <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> si nécessaire. Le désavantage principal est que si vous faites référence à un alias de table du jeu de requête dans le code SQL brut, il est alors possible que Django modifie cet alias (par exemple lorsque le jeu de requête est utilisé comme sous-requête dans une autre requête).</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Vous devez être très prudent lors de l’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>. Lors de chaque utilisation, vous devez échapper tout paramètre pouvant être contrôlé par les utilisateurs en employant <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> afin de vous protéger contre les attaques par injection SQL.</p>\n<p>Vous devez aussi éviter de placer les substituants entre guillemets dans la chaîne SQL. Cet exemple est vulnérable à l’injection SQL en raison des guillemets autour de <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code>:</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=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">sometable</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">othercol</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;%s&#39;</span><span class=\"w\">  </span><span class=\"o\">#</span><span class=\"w\"> </span><span class=\"n\">unsafe</span><span class=\"o\">!</span>\n</code></pre></div>\n<p>Vous pouvez en apprendre davantage sur le fonctionnement de la <a class=\"reference internal\" href=\"/fr/3.2/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">protection contre les injections SQL</span></a> de Django.</p>\n</aside>\n<p>Par définition, ces expressions <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> ne sont pas toujours portables entre moteurs de base de données (parce que vous écrivez du code SQL explicitement) et elles violent le principe DRY (ne pas se répéter), il s’agit donc de les éviter autant que possible.</p>\n<p>Indiquez un ou plusieurs des paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code>. Aucun n’est obligatoire, mais vous devez en indiquer au moins un.</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code></p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> vous permet d’indiquer des champs supplémentaires dans la clause <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>. Ce doit être un dictionnaire faisant correspondre des noms d’attributs à des clauses SQL utilisées pour calculer l’attribut concerné.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;is_recent&#39;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Avec ceci, chaque objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> possède un attribut supplémentaire, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_recent</span></code>, une valeur booléenne indiquant si le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> de l’objet est plus grand que le 1er janvier 2006.</p>\n<p>Django insère l’extrait SQL donné directement dans l’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>. Le code SQL résultant de l’exemple ci-dessus ressemblerait donc à ceci :</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=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2006-01-01&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"n\">is_recent</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>L’exemple suivant est plus pointu ; il effectue une sous-requête pour donner à chaque objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> du résultat un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">entry_count</span></code>, un nombre entier comptant les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> associés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span>\n        <span class=\"s1\">&#39;entry_count&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id&#39;</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Dans ce cas particulier, nous exploitons le fait que la requête contiendra déjà la table <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_blog</span></code> dans sa clause <code class=\"docutils literal notranslate\"><span class=\"pre\">FROM</span></code>.</p>\n<p>Le code SQL résultant de l’exemple ci-dessus donnerait :</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=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"k\">COUNT</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">.</span><span class=\"n\">blog_id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"n\">entry_count</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Notez que les parenthèses exigées par la plupart des moteurs de base de données autour des sous-requêtes ne sont pas obligatoires dans les clauses <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> de Django. Signalons aussi que certains moteurs de base de données tels que certaines versions de MySQL ne prennent pas en charge les sous-requêtes.</p>\n<p>Dans certains cas exceptionnels, il peut être souhaitable de transmettre des paramètres aux fragments SQL dans <code class=\"docutils literal notranslate\"><span class=\"pre\">extra(select=...)</span></code>. Pour faire cela, utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">select_params</span></code>.</p>\n<p>Ceci fonctionnera, par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">},</span>\n    <span class=\"n\">select_params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;one&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;two&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous avez besoin d’utiliser un <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> littéral à l’intérieur de la chaîne de sélection, utilisez la séquence <code class=\"docutils literal notranslate\"><span class=\"pre\">%%s</span></code>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> / <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code></p>\n<p>Il est possible de définir des clauses SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> explicites — peut-être pour effectuer des jointures non explicites — en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code>. Des tables peuvent être manuellement ajoutées à la clause SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">FROM</span></code> par le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> acceptent tous deux une liste de chaînes de caractères. Tous les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> sont combinés avec les autres critères de recherche par l’opérateur « ET ».</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo=&#39;a&#39; OR bar = &#39;a&#39;&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;baz = &#39;a&#39;&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>…peut être (grossièrement) traduit en code SQL comme :</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=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">foo</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">bar</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">baz</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Soyez prudent en utilisant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> si celui-ci contient des tables déjà utilisées dans le requête. Lorsque vous ajoutez des tables supplémentaires par le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code>, Django suppose que vous voulez que cette table soit ajoutée une fois de plus, si elle s’y trouve déjà. Cela pose un problème, car le nom de table recevra alors un alias. Si une table apparaît plusieurs fois dans une instruction SQL, son nom est remplacé par un alias à partir de la deuxième occurrence, afin que la base de données puisse les différencier. Si alors dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> supplémentaire, vous vous référez à la table que vous avez explicitement ajoutée, vous obtiendrez des erreurs.</p>\n<p>En temps normal, seules les tables qui ne font pas encore partie de la requête devraient être ajoutées. Cependant, si le cas ci-dessus se présente, il existe des solutions. Regardez premièrement si vous pouvez éviter d’inclure la table supplémentaire et utiliser celle qui se trouve déjà dans la requête. Si ce n’est pas possible, placez l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> au début de la construction du jeu de requête afin que la table concernée soit la première occurrence. Finalement, si aucune autre solution ne fonctionne, examinez la requête générée et réécrivez le contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> afin d’utiliser l’alias attribué à la table supplémentaire. L’alias sera toujours le même tant que vous construisez le jeu de requête de la même manière, il est donc possible de se fier à la stabilité du nom d’alias.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code></p>\n<p>Si vous avez besoin de trier les résultats de requête à l’aide de nouveaux champs ou tables que vous avez inclus par <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>, utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> et complétez-le par une liste de chaînes. Celles-ci doivent correspondre soit à des champs de modèles (comme pour la méthode <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> habituelle des jeux de requête) sous la forme <code class=\"docutils literal notranslate\"><span class=\"pre\">nom_table.nom_colonne</span></code>, soit à un alias d’une colonne définie dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;is_recent&#39;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\n<span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">order_by</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;-is_recent&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Ce code place en premier dans les résultats tous les éléments pour lesquels <code class=\"docutils literal notranslate\"><span class=\"pre\">is_recent</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (dans un tri descendant, <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> apparaît avant <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>).</p>\n<p>Par ailleurs, cela montre aussi que vous pouvez appelez <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> plusieurs fois en obtenant le comportement attendu (ajout successif de nouvelles contraintes).</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code></p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> décrit ci-dessus peut utiliser des chaînes de substitution de base de données comme en Python standard, <code class=\"docutils literal notranslate\"><span class=\"pre\">'%s'</span></code>, pour indiquer au moteur de base de données des paramètres qu’il faut automatiquement placer entre guillemets. Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> est une liste de paramètres supplémentaires à utiliser dans la substitution.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;headline=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">],</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Utilisez toujours <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> au lieu d’insérer des valeurs directement dans la clause <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code>, parce que <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> garantit que les valeurs seront mises correctement entre guillemets en fonction de la base de données utilisée. Par exemple, les guillemets dans les chaînes seront échappés correctement.</p>\n<p>Faux :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=&#39;Lennon&#39;&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Juste :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;headline=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">],</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n</li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Si vous effectuez des requêtes vers MySQL, notez que le forçage de type silencieux de MySQL peut produire des résultats inattendus lors du mélange de types. Si une requête porte sur une colonne de type chaîne mais contient une valeur nombre entier, MySQL transforme le type de toutes les valeurs de la table en nombre entier avant d’effectuer la comparaison. Par exemple, si la table contient les valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'def'</span></code> et que la requête contient <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">macolonne=0</span></code>, les deux lignes seront sélectionnées. Pour empêcher cela, effectuez les transformations de type avant d’utiliser une valeur dans une requête.</p>\n</aside>\n</section>\n<section id=\"defer\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code><a class=\"heading-anchor\" href=\"#defer\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.defer\">\n<span class=\"sig-name descname\"><span class=\"pre\">defer</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.defer\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Dans certaines situations complexes de structures de données, des modèles peuvent contenir un grand nombre de champs, et certains champs contenir beaucoup de données (par exemple pour les champs texte) ; parfois, la conversion de certaines valeurs en objet Python est coûteuse en performances. Si vous utilisez les résultats d’une requête dans une situation où vous n’êtes pas certain d’avoir besoin de certains champs lors de la requête initiale pour obtenir les données, vous pouvez indiquer à Django de ne pas les récupérer de la base de données.</p>\n<p>Ceci se fait en indiquant les noms des champs à ne pas charger dans <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Un jeu de requête comportant des champs différés renvoie tout de même des instances de modèles. Chaque champ différé sera récupéré de la base de données si vous y faites référence (un à la fois, pas tous les champs différés d’un coup).</p>\n<p>On peut appeler plusieurs fois <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>. Chaque appel ajoute les nouveaux champs à l’ensemble des champs différés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Defers both the body and headline fields.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">rating</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’ordre dans lequel les champs sont ajoutés à l’ensemble différé n’a pas d’importance. L’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> avec un nom de champ qui a déjà été indiqué comme différé ne pose pas de problème (le champ sera toujours considéré comme différé).</p>\n<p>Vous pouvez différer le chargement de champs dans des modèles liés (si les modèles liés sont chargés par <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a>) en utilisant la notation standard de double soulignement pour séparer les champs liés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous souhaitez effacer l’ensemble des champs différés, indiquez <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> comme paramètre à <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Load all fields immediately.</span>\n<span class=\"n\">my_queryset</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Certains champs d’un modèle ne seront pas différés, même si vous demandez de le faire. Le chargement de la clé primaire ne peut jamais être différé. Si vous utilisez <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> pour récupérer des modèles liés, vous ne devriez pas différer le chargement du champ qui fait la liaison entre le modèle principal et le modèle lié, sous peine d’obtenir une erreur.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> (et sa cousine <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> décrite ci-dessous) est réservée aux situations spéciales. Elles permettent d’optimiser après avoir analysé attentivement les requêtes en comprenant <em>exactement</em> les informations nécessaires et après avoir mesuré que la différence entre le chargement des champs utiles ou le chargement de tous les champs du modèle constitue une amélioration significative.</p>\n<p>Même si vous pensez que vous vous trouvez dans un cas de situation spéciale, <strong>n’utilisez ``defer()`` que si vous ne pouvez pas déterminer au moment de charger la requête si vous aurez besoin des champs supplémentaires ou pas</strong>. Si vous chargez et utilisez fréquemment un sous-ensemble particulier de données, la meilleure solution est de normaliser vos modèles et de placer les données non chargées dans un modèle séparé (donc une autre table de base de données). Si les colonnes <em>doivent</em> rester dans une seule table pour une raison précise, créez un modèle avec <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.managed</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> (voir la documentation de l’attribut <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">managed</span></code></a>) contenant uniquement les champs que vous avez normalement besoin de charger et utilisez ce modèle là où vous utiliseriez <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>. Cela rend votre code plus explicite, légèrement plus rapide et consomme un petit peu moins de mémoire dans le processus Python.</p>\n<p>Par exemple, ces modèles utilisent tous deux la même table de base de données en arrière-plan :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommonlyUsedModel</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\">f1</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">managed</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;app_largetable&#39;</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ManagedModel</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\">f1</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n    <span class=\"n\">f2</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;app_largetable&#39;</span>\n\n<span class=\"c1\"># Two equivalent QuerySets:</span>\n<span class=\"n\">CommonlyUsedModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"n\">ManagedModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s1\">&#39;f2&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si plusieurs champs ont besoin d’être dupliqués dans le modèle non piloté, il peut être préférable de créer un modèle abstrait avec les champs partagés et de faire ensuite hériter les modèles piloté et non piloté de ce modèle abstrait.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Lors de l’appel à <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> pour des instances avec champs différés, seuls les champs chargés sont enregistrés. Voir <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> pour plus de détails.</p>\n</aside>\n</section>\n<section id=\"only\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code><a class=\"heading-anchor\" href=\"#only\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.only\">\n<span class=\"sig-name descname\"><span class=\"pre\">only</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.only\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> est plus ou moins le contraire de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a>. Il s’agit de l’appeler en indiquant les champs qui ne doivent <em>pas</em> être différés lors du chargement d’un modèle (tous les autres le seront). Si vous avez un modèle dont presque tous les champs doivent être différés, le code peut parfois être simplifié en indiquant l’ensemble complémentaire des champs.</p>\n<p>Supposons qu’un modèle possède les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">biography</span></code>. Les deux requêtes suivantes sont identiques en terme de champs différés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;age&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;biography&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>À chaque appel de <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code>, l’ensemble des champs à charger immédiatement est <em>remplacé</em>. Le nom de la méthode est mnémonique : <strong>seuls</strong> (only en anglais) ces champs sont chargés immédiatement ; les autres sont différés. Ainsi, quand <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> est appelé plusieurs fois successivement, seuls les champs du dernier appel sont pris en compte :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This will defer all fields except the headline.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Comme <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> se comporte de manière incrémentale (ajoutant les champs à la liste différée), vous pouvez combiner les appels à <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> et tout devrait se passer comme prévu :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Final result is that everything except &quot;headline&quot; is deferred.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Final result loads headline and body immediately (only() replaces any</span>\n<span class=\"c1\"># existing set of fields).</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Tous les avertissements de la note de la documentation de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> s’appliquent également à <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code>. Utilisez-la prudemment et seulement après avoir épuisé les autres options possibles.</p>\n<p>L’utilisation d”<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> en omettant un champ demandé par <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> constitue aussi une erreur.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Lors de l’appel à <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> pour des instances avec champs différés, seuls les champs chargés sont enregistrés. Voir <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> pour plus de détails.</p>\n</aside>\n</section>\n<section id=\"using\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">using()</span></code><a class=\"heading-anchor\" href=\"#using\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.using\">\n<span class=\"sig-name descname\"><span class=\"pre\">using</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">alias</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.using\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode sert à contrôler la base de données qui sera la cible d’évaluation du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dans le cas où plusieurs bases de données sont définies. Le seul paramètre admis par cette méthode est l’alias d’une base de données, tel que défini dans <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># queries the database with the &#39;default&#39; alias.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># queries the database with the &#39;backup&#39; alias</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;backup&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"select-for-update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code><a class=\"heading-anchor\" href=\"#select-for-update\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_for_update\">\n<span class=\"sig-name descname\"><span class=\"pre\">select_for_update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">nowait</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">skip_locked</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">of</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">no_key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_for_update\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un jeu de requête qui verrouille les lignes jusqu’à la fin de la transaction, générant une instruction SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> pour les bases de données qui la prennent en charge.</p>\n<p>Par exemple :</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\">transaction</span>\n\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n<span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n    <span class=\"k\">for</span> <span class=\"n\">entry</span> <span class=\"ow\">in</span> <span class=\"n\">entries</span><span class=\"p\">:</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>Lorsque le jeu de requête est évalué (<code class=\"docutils literal notranslate\"><span class=\"pre\">for</span> <span class=\"pre\">entry</span> <span class=\"pre\">in</span> <span class=\"pre\">entries</span></code> dans ce cas), toutes les lignes de base de données correspondantes sont verrouillées jusqu’à la fin du bloc transactionnel, ce qui veut dire que d’autres transactions ne pourront ni modifier ni verrouiller elles-mêmes ces lignes.</p>\n<p>Normalement, si une autre transaction a déjà verrouillé l’une des lignes sélectionnées, la requête est bloquée en attendant que le verrou soit levé. Si ce n’est pas ce que vous voulez, appelez <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(nowait=True)</span></code>. L’appel est alors non bloquant. Si un verrou est déjà posé par une autre transaction sur un des éléments à sélectionner, une exception <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DatabaseError</span></code></a> est générée lors de l’évaluation du jeu de requête. Il est aussi possible d’ignorer les lignes verrouillées en utilisant plutôt <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(skip_locked=True)</span></code>. Les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked</span></code> sont mutuellement exclusifs ; s’ils sont les deux activés lors de l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>, une erreur <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a> sera produite.</p>\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> verrouille toutes les lignes qui sont sélectionnées par la requête. Par exemple, les lignes des objets liés mentionnés dans <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> sont verrouillés en plus des lignes du modèle du jeu de requête. Si ce n’est pas souhaité, indiquez les objets liés que vous voulez verrouiller dans <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(of=(...))</span></code> en utilisant la même syntaxe de noms de champs que pour <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a>. Utilisez la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">'self'</span></code> pour vous référer au modèle du jeu de requête.</p>\n<aside class=\"admonition-lock-parents-models-in-select-for-update-of admonition\">\n<p class=\"admonition-title\">Verrouille les modèles parents dans <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(of=(...))</span></code></p>\n<p>Si vous souhaitez verrouiller les modèles parents dans un contexte d”<a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">héritage multiple</span></a>, vous devez indiquer les champs de lien parent (par défaut <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;parent_model_name&gt;_ptr</span></code>) dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code>. Par exemple</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">(</span><span class=\"n\">of</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;self&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;place_ptr&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n</aside>\n<p>Avec PostgreSQL uniquement, vous pouvez passer <code class=\"docutils literal notranslate\"><span class=\"pre\">no_key=True</span></code> afin d’acquérir un verrou plus faible, qui permet quand même la création de lignes qui ne font que référencer les lignes verrouillées (au travers d’une clé étrangère, par exemple). La documentation PostgreSQL contient plus de détails au sujet des <a class=\"reference external\" href=\"https://docs.postgresql.fr/13/explicit-locking.html#LOCKING-ROWS\">modes de verrouillage au niveau ligne</a>.</p>\n<p>Il n’est pas possible d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> sur des relations pouvant être nulles</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\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;hometown&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">django.db.utils.NotSupportedError</span>: <span class=\"n\">FOR UPDATE cannot be applied to the nullable side of an outer join</span>\n</code></pre></div>\n<p>Pour éviter cette restriction, vous pouvez exclure les objets nuls si vous n’en avez pas besoin</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\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;hometown&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">hometown</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: ...)&gt;, ...]&gt;</span>\n</code></pre></div>\n<p>En ce moment, les moteurs de base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">oracle</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> prennent en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>. Cependant, MariaDB 10.3+ ne gère que le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code> et MySQL 8.0.1+ gère les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code>. Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">no_key</span></code> n’est pris en charge que par PostgreSQL.</p>\n<p>Si vous passez <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait=True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked=True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">no_key=True</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> et que le moteur de base de données ne prend pas en charge ces options, comme pour MySQL, une exception <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code></a> est générée. Ceci évite que du code soit bloqué de manière inattendue.</p>\n<p>L’évaluation d’un jeu de requête avec <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> en mode autocommit avec les bases de données qui prennent en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> est une erreur <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.transaction.TransactionManagementError\" title=\"django.db.transaction.TransactionManagementError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TransactionManagementError</span></code></a>, car dans ce cas-là, les lignes ne sont pas verrouillées. Si c’était permis, ce serait un vecteur de corruption de données qui pourrait facilement être provoqué par l’appel de code conçu pour être exécuté dans une transaction en dehors d’une transaction.</p>\n<p>L’emploi de <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> avec des moteurs qui ne prennent pas en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> (comme pour SQLite) n’aura aucun effet. <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> ne sera pas ajouté à la requête et aucune erreur ne sera produite si <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> est utilisé en mode autocommit.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Même si <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> échoue normalement en mode autocommit, puisque <a class=\"reference internal\" href=\"/fr/3.2/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a> englobe automatiquement chaque test dans une transaction, l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> dans un <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code> même en dehors d’un bloc <a class=\"reference internal\" href=\"/fr/3.2/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> va passer (peut-être de façon inattendue) sans générer d’exception <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionManagementError</span></code>. Pour tester convenablement <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>, vous devez utiliser <a class=\"reference internal\" href=\"/fr/3.2/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a>.</p>\n</aside>\n<aside class=\"admonition-certain-expressions-may-not-be-supported admonition\">\n<p class=\"admonition-title\">Certaines expressions peuvent ne pas être prises en charge</p>\n<p>PostgreSQL ne prend pas en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> avec les expressions <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Window</span></code></a>.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"3.2\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">no_key</span></code> a été ajouté.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code> est désormais autorisé avec MySQL 8.0.1+.</p>\n</aside>\n</section>\n<section id=\"raw\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code><a class=\"heading-anchor\" href=\"#raw\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.raw\">\n<span class=\"sig-name descname\"><span class=\"pre\">raw</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_query</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">translations</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\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.raw\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepte une requête SQL brute, l’exécute et renvoie une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.query.RawQuerySet</span></code>. Il est possible alors d’effectuer une boucle sur cette instance <code class=\"docutils literal notranslate\"><span class=\"pre\">RawQuerySet</span></code> tout comme pour un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> normal afin d’accéder aux instances d’objets.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/3.2/topics/db/sql/\"><span class=\"doc\">Lancement de requêtes SQL brutes</span></a> pour plus d’informations.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> génère toujours une nouvelle requête et ne tient pas compte d’éventuels filtrages précédents. Ainsi, elle ne devrait généralement être appelée que depuis un <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> ou une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> toute neuve.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"3.2\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>La valeur par défaut de l’argument <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> est passée de <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> à un tuple vide.</p>\n</aside>\n</section>\n</section>\n<section id=\"operators-that-return-new-querysets\">\n<h3>Opérateurs renvoyant de nouveaux <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#operators-that-return-new-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les jeux de requête combinés doivent utiliser le même modèle.</p>\n<section id=\"and\">\n<h4>AND (<code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code>)<a class=\"heading-anchor\" href=\"#and\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Combine deux requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> en utilisant l’opérateur SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> (ET).</p>\n<p>Les requêtes suivantes sont équivalentes</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n</section>\n<section id=\"or\">\n<h4>OR (<code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code>)<a class=\"heading-anchor\" href=\"#or\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Combine deux requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> en utilisant l’opérateur SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> (OU).</p>\n<p>Les requêtes suivantes sont équivalentes</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"methods-that-do-not-return-querysets\">\n<h3>Méthodes qui ne renvoient pas de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#methods-that-do-not-return-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> suivantes évaluent le  <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> et renvoie <em>quelque chose d’autre</em> qu’un  <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Ces méthodes n’utilisent pas de cache (voir <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#caching-and-querysets\"><span class=\"std std-ref\">Mise en cache et objets QuerySet</span></a>). Elles accèdent à la base de données lors de chaque appel.</p>\n<section id=\"get\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code><a class=\"heading-anchor\" href=\"#get\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get\">\n<span class=\"sig-name descname\"><span class=\"pre\">get</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie l’objet correspondant aux paramètres de recherche indiqués, qui doivent être dans le format décrit dans <a class=\"reference internal\" href=\"#id4\">Recherches dans les champs</a>. Vous devriez utiliser des critères qui sont garantis comme uniques, tels que des clés primaires ou des champs disposant d’une contrainte d’unicité. Par exemple</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">entry_number</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Si vous pensez qu’une requête ne contient déjà qu’une seule ligne, vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> sans paramètre pour obtenir l’objet correspondant à cette ligne :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> ne trouve aucun objet, il génère l’exception <a class=\"reference internal\" href=\"/fr/3.2/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Model.DoesNotExist</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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=-</span><span class=\"mi\">999</span><span class=\"p\">)</span> <span class=\"c1\"># raises Entry.DoesNotExist</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> trouve plus qu’un objet, il génère une exception <a class=\"reference internal\" href=\"/fr/3.2/ref/models/class/#django.db.models.Model.MultipleObjectsReturned\" title=\"django.db.models.Model.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Model.MultipleObjectsReturned</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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;A Duplicated Name&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># raises Entry.MultipleObjectsReturned</span>\n</code></pre></div>\n<p>Ces deux classes d’exceptions sont des attributs de la classe de modèle et sont spécifiques à ces modèles. Si vous souhaitez intercepter de telles exceptions provenant de plusieurs appels <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> pour différents modèles, vous pouvez utiliser leur classe de base générique. Par exemple, vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">django.core.exceptions.ObjectDoesNotExist</span></code></a> pour intercepter les exceptions <a class=\"reference internal\" href=\"/fr/3.2/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DoesNotExist</span></code></a> de modèles différents</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.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ObjectDoesNotExist</span>\n\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">blog</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog</span><span class=\"p\">,</span> <span class=\"n\">entry_number</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">ObjectDoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Either the blog or entry doesn&#39;t exist.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code><a class=\"heading-anchor\" href=\"#create\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.create\">\n<span class=\"sig-name descname\"><span class=\"pre\">create</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\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.create\"><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 méthode d’agrément pour la création d’un objet et son enregistrement en une seule méthode. Ainsi :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>et :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>sont équivalents.</p>\n<p>Le paramètre <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">force_insert</span></a> est documenté ailleurs, mais il indique qu’un nouvel objet sera toujours créé. Vous n’avez normalement pas à vous préoccuper de ce paramètre. Cependant, si le modèle contient une valeur de clé primaire que vous avez définie manuellement et que cette valeur existe déjà en base de données, l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code> échoue avec l’erreur <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> car les clés primaires doivent rester uniques. Soyez prêt à traiter l’exception si vous définissez manuellement des clés primaires.</p>\n</section>\n<section id=\"get-or-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code><a class=\"heading-anchor\" href=\"#get-or-create\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</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\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get_or_create\"><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 méthode utile pour rechercher un objet correspondant aux paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> indiqués (qui peuvent être vides si le modèle contient des valeurs par défaut pour tous les champs), et qui crée un objet si nécessaire.</p>\n<p>Renvoie un tuple <code class=\"docutils literal notranslate\"><span class=\"pre\">(objet,</span> <span class=\"pre\">créé)</span></code> où <code class=\"docutils literal notranslate\"><span class=\"pre\">objet</span></code> est l’objet chargé ou créé et <code class=\"docutils literal notranslate\"><span class=\"pre\">créé</span></code> est une valeur booléenne indiquant si un nouvel objet a été créé.</p>\n<p>L’idée est d’éviter la création d’objets dupliqués lorsque des requêtes sont exécutées en parallèle ; ceci est une sorte de raccourci pour éviter des lignes de code redondantes. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span> <span class=\"n\">birthday</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">))</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Ici, il est possible que plusieurs requêtes parallèles tentent d’enregistrer une <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> avec les même paramètres. Pour éviter cette situation de concurrence, l’exemple ci-dessus peut être réécrit en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code>, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span>\n    <span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;birthday&#39;</span><span class=\"p\">:</span> <span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">)},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Tout paramètre nommé transmis à <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> — <em>excepté</em> le paramètre facultatif appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> — seront utilisés dans un appel à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>. Si un objet est trouvé, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> renvoie un tuple composé de cet objet ainsi que de <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Cette méthode est atomique en partant du principe que la base de données assure l’unicité des paramètres nommés (voir <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a> ou <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a>). Si les champs utilisés dans les paramètres nommés n’ont pas de contrainte d’unicité, des appels concurrents à cette méthode peuvent aboutir à l’insertion de plusieurs lignes ayant les mêmes valeurs.</p>\n</aside>\n<p>Vous pouvez indiquer des conditions plus complexes pour l’objet à trouver en chaînant <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> avec <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> et en utilisant des <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">objets</span> <span class=\"pre\">Q</span></code></a>. Par exemple, pour récupérer Robert ou Bob Marley si l’un des deux existe et pour créer le dernier dans le cas contraire</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.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n\n<span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n    <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Robert&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Marley&#39;</span><span class=\"p\">,</span> <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Si plusieurs objets ont été trouvés, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> génère <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.core.exceptions.MultipleObjectsReturned\" title=\"django.core.exceptions.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MultipleObjectsReturned</span></code></a>. SI un objet n’a <em>pas</em> été trouvé, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> crée une instance d’objet et l’enregistre, renvoyant un tuple composé de ce nouvel objet et de <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Le nouvel objet sera créé en suivant grossièrement cet algorithme</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"s1\">&#39;__&#39;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">k</span><span class=\"p\">}</span>\n<span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">({</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"nb\">callable</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()})</span>\n<span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">params</span><span class=\"p\">)</span>\n<span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>En français, cela veut dire qu’on commence par tout paramètre nommé autre que <code class=\"docutils literal notranslate\"><span class=\"pre\">'defaults'</span></code> et qui ne contient pas de double soulignement (ce qui indiquerait une recherche non exacte). Puis on ajoute le contenu de <code class=\"docutils literal notranslate\"><span class=\"pre\">'defaults'</span></code>, surchargeant d’éventuels paramètres existants, et on utilise le résultat comme paramètres nommés de la classe de modèle. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> contient des éléments exécutables, ils sont évalués. Comme déjà dit, il s’agit d’une simplification de l’algorithme réel, mais tous les éléments importants sont là. L’implémentation réelle contient quelques contrôles d’erreur supplémentaires et traite quelques conditions extrêmes ; si cela vous intéresse, lisez le code.</p>\n<p>Si vous avez un champ nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> et que vous voulez l’utiliser comme recherche exacte dans <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code>, indiquez <code class=\"docutils literal notranslate\"><span class=\"pre\">'defaults__exact'</span></code>, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Foo</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">defaults__exact</span><span class=\"o\">=</span><span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">,</span> <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;defaults&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;baz&#39;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Le comportement d’erreur de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> est semblable à celui de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">create()</span></code></a> lorsque vous définissez des clés primaires manuellement. Si un objet doit être créé et que la clé primaire existe déjà en base de données, une exception <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> est générée.</p>\n<p>Pour terminer, un mot sur l’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> dans les vues Django. Faites attention de ne l’utiliser que dans des requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, sauf si vous avez des bonnes raisons de faire autrement. Les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> ne sont pas censées modifier des données. Il faudrait toujours utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> lorsqu’une requête sur une page provoque des effets de bord sur les données. Pour plus de détails, lisez <span class=\"target\" id=\"index-6\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7231.html#section-4.2.1\"><strong>Safe methods</strong></a> dans la spécification HTTP.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> au travers d’attributs <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> et de relations inverses. Dans ce cas, vous allez restreindre les requêtes dans le contexte de cette relation. Certains problèmes d’intégrité peuvent apparaître si vous ne l’utilisez pas de manière cohérente.</p>\n<p>Compte tenu des modèles suivants :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Chapter</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\">title</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\">255</span><span class=\"p\">,</span> <span class=\"n\">unique</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</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\">256</span><span class=\"p\">)</span>\n    <span class=\"n\">chapters</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Chapter</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> au travers du champ <code class=\"docutils literal notranslate\"><span class=\"pre\">chapters</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>, mais il ne considère alors que les objets dans le contexte de ce <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Ulysses&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, True)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, False)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Chapter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Chapter: Chapter 1&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\"># Raises IntegrityError</span>\n</code></pre></div>\n<p>Cela se passe ainsi parce qu’il essaie d’obtenir ou de créer « Chapter 1 » au travers du livre « Ulysses », mais il ne peut faire ni l’un ni l’autre : la relation ne peut pas obtenir ce chapitre puisqu’il ne se trouve pas dans ce livre, mais il ne peut pas non plus le créer car le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> doit être unique.</p>\n</aside>\n</section>\n<section id=\"update-or-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create()</span></code><a class=\"heading-anchor\" href=\"#update-or-create\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">update_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</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\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update_or_create\"><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 méthode utilitaire pour mettre à jour un objet avec les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> donnés, en créant un nouvel objet si nécessaire. Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> est un dictionnaire de paires (champ, valeur) utilisé pour mettre à jour l’objet. Les valeurs dans <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> peuvent être exécutables.</p>\n<p>Renvoie un tuple <code class=\"docutils literal notranslate\"><span class=\"pre\">(objet,</span> <span class=\"pre\">créé)</span></code> où <code class=\"docutils literal notranslate\"><span class=\"pre\">objet</span></code> est l’objet créé ou mis à jourcréé et <code class=\"docutils literal notranslate\"><span class=\"pre\">créé</span></code> est une valeur booléenne indiquant si un nouvel objet a été créé.</p>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create</span></code> essaie de récupérer un objet de la base de données en fonction des paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> indiqués. Si une correspondance est trouvée, elle met à jour les champs transmis dans le dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code>.</p>\n<p>L’intention est de fournir un raccourci à la place de code répétitif. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">}</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">():</span>\n        <span class=\"nb\">setattr</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"k\">except</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"n\">new_values</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">}</span>\n    <span class=\"n\">new_values</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">defaults</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">new_values</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Ce schéma devient tendancieux au fur et à mesure que le nombre de champs d’un modèle augmente. L’exemple ci-dessus peut être réécrit en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create()</span></code> comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update_or_create</span><span class=\"p\">(</span>\n    <span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour une description détaillée sur la manière dont les noms transmis dans <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> sont résolus, voir <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a>.</p>\n<p>Comme expliqué plus haut pour <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a>, cette méthode est sujette à un conflit de concurrence qui peut aboutir à l’insertion simultanée de plusieurs lignes si l’unicité n’est pas garantie au niveau de la base de données.</p>\n<p>Comme <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">create()</span></code></a>, si vous définissez des clés primaires manuellement et qu’un objet doit être créé mais que la clé primaire existe déjà en base de données, une exception <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> est générée.</p>\n</section>\n<section id=\"bulk-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code><a class=\"heading-anchor\" href=\"#bulk-create\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">bulk_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</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\">ignore_conflicts</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_create\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode insère la liste d’objets indiquée dans la base de données de manière efficace (généralement par une seule requête, quel que soit le nombre d’objets concernés) et renvoie les objets créés dans une liste, dans le même ordre que dans l’argument :</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\">objs</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">([</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is a test&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is only a test&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Cette méthode présente toutefois quelques inconvénients :</p>\n<ul>\n<li><p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> de chaque modèle n’est pas appelée et les signaux <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_save</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">post_save</span></code> ne sont pas envoyés.</p></li>\n<li><p>Elle ne fonctionne pas avec des modèles enfants dans un contexte d’héritage multitable.</p></li>\n<li><p>Si la clé primaire du modèle est un champ <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a>, l’attribut clé primaire ne peut être obtenu qu’avec certaines bases de données (actuellement PostgreSQL et MariaDB 10.5+). Avec les autres bases de données, il ne sera pas défini.</p></li>\n<li><p>Elle ne fonctionne pas avec les relations plusieurs-à-plusieurs.</p></li>\n<li><p>Elle force <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> à être une liste, ce qui évalue entièrement <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> s’il s’agit d’un générateur. Ce forçage permet d’inspecter tous les objets afin que tout objet ayant une clé primaire définie manuellement soit inséré en premier. Si vous souhaitez insérer des objets en lots sans évaluer d’abord le générateur entier, vous pouvez utiliser cette technique tant que les objets n’ont aucune clé primaire définie manuellement</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\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">islice</span>\n\n<span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"mi\">100</span>\n<span class=\"n\">objs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Test </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1000</span><span class=\"p\">))</span>\n<span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">islice</span><span class=\"p\">(</span><span class=\"n\">objs</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">batch</span><span class=\"p\">:</span>\n        <span class=\"k\">break</span>\n    <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span><span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> permet de contrôler le nombre d’objets créés dans une seule requête. Par défaut, tous les objets sont créés en une seule instruction, à l’exception de SQLite où par défaut, le nombre maximum de 999 variables par requête est appliqué.</p>\n<p>Pour les bases de données qui le gèrent (toutes à l’exception d’Oracle), la définition du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">ignore_conflicts</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> indique à la base de données d’ignorer les échecs d’insertion de lignes qui ne respectent pas les contraintes telles que les valeurs uniques dupliquées. L’activation de ce paramètre désactive la possibilité de définir la clé primaire sur chaque instance de modèle (dans le cas où la base de données le gère normalement).</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Avec MySQL et MariaDB, quand on indique le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">ignore_conflicts</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, certains types d’erreurs autres que la clé dupliquée sont transformés en avertissements, même en mode strict. Par exemple : les valeurs non valables ou les violations de champ non nul. Consultez la <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison\">documentation MySQL</a> et la <a class=\"reference external\" href=\"https://mariadb.com/kb/en/ignore/\">documentation MariaDB</a> pour plus de détails.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>La prise en charge de la récupération des attributs de clé primaire avec MariaDB 10.5+ a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"bulk-update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">bulk_update()</span></code><a class=\"heading-anchor\" href=\"#bulk-update\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_update\">\n<span class=\"sig-name descname\"><span class=\"pre\">bulk_update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_update\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode met à jour efficacement les champs donnés sur les instances de modèles fournies, en général avec une seule requête</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\">objs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n<span class=\"gp\">... </span>   <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Entry 1&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>   <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Entry 2&#39;</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\">objs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;This is entry 1&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">objs</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;This is entry 2&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_update</span><span class=\"p\">(</span><span class=\"n\">objs</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#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\">QuerySet.update()</span></code></a> est utilisé pour enregistrer les modifications, c’est donc plus efficace que de boucler sur la liste des modèles et d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> sur chacun d’entre eux, mais cela comporte quelques inconvénients :</p>\n<ul class=\"simple\">\n<li><p>Il n’est pas possible de mettre à jour la clé primaire des modèles.</p></li>\n<li><p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> des modèles n’est pas appelée et les signaux <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> ne sont pas envoyés.</p></li>\n<li><p>SI la mise à jour concerne un grand nombre de colonnes pour un grand nombre de lignes, le code SQL produit peut devenir très volumineux. Évitez cela en indiquant une valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> appropriée.</p></li>\n<li><p>La mise à jour de champs définis sur des instances parentes dans un contexte d’héritage multitable va générer une requête supplémentaire par parent.</p></li>\n<li><p>Lorsqu’un lot individuel contient des doublons, seule la première instance du lot produira une mise à jour.</p></li>\n</ul>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> permet de contrôler le nombre d’objets enregistrés dans une seule requête. Par défaut, tous les objets sont enregistrés en une seule instruction, à l’exception de SQLite et Oracle qui ont des restrictions sur le nombre de variables utilisables dans une requête.</p>\n</section>\n<section id=\"count\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code><a class=\"heading-anchor\" href=\"#count\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.count\">\n<span class=\"sig-name descname\"><span class=\"pre\">count</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.count\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un nombre entier représentant le nombre d’objets de base de données correspondant au <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Returns the total number of entries in the database.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Returns the number of entries whose headline contains &#39;Lennon&#39;</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> génère une instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">COUNT(*)</span></code> en arrière-plan, il est donc conseiller de toujours utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> plutôt que de charger tous les résultats en objets Python et d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code> sur cette liste d’objets (sauf dans le cas où vous avez de toute façon besoin de charger les objets en mémoire, auquel cas <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code> sera plus rapide).</p>\n<p>Notez que si vous souhaitez obtenir le nombre d’élément d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> et que vous allez aussi exploiter ses instances de modèles (par exemple dans une itération), il est probablement plus efficace d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">len(queryset)</span></code> qui ne produira pas de requête de base de données supplémentaire comme le ferait <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code>.</p>\n<p>Si le jeu de requête a déjà été pleinement récupéré, <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> calculera la longueur sur ce résultat et n’effectuera pas de requête supplémentaire en base de données.</p>\n</section>\n<section id=\"in-bulk\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk()</span></code><a class=\"heading-anchor\" href=\"#in-bulk\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.in_bulk\">\n<span class=\"sig-name descname\"><span class=\"pre\">in_bulk</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">id_list</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=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'pk'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.in_bulk\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepte une liste de valeurs de champs (<code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code>) ainsi que le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> correspondant à ces valeurs et renvoie un dictionnaire faisant correspondre chaque valeur à une instance d’objet ayant la valeur de champ donnée. Aucune exception <a class=\"reference internal\" href=\"/fr/3.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">django.core.exceptions.ObjectDoesNotExist</span></code></a> n’est produite par <code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk</span></code>, c’est-à-dire que les valeurs de <code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code> qui ne correspondent à aucune instance seront simplement ignorées. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code> n’est pas fourni, tous les objets du jeu de requête sont renvoyés. <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> doit être un champ unique ou un champ distinct (si la méthode <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> ne contient qu’un seul champ). <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> représente la clé primaire par défaut.</p>\n<p>Exemple :</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\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([])</span>\n<span class=\"go\">{}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">()</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;, 3: &lt;Blog: Django Weblog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"s1\">&#39;beatles_blog&#39;</span><span class=\"p\">],</span> <span class=\"n\">field_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;beatles_blog&#39;: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">(</span><span class=\"n\">field_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;Beatles Blog&#39;: &lt;Blog: Beatles Blog&gt;, &#39;Cheddar Talk&#39;: &lt;Blog: Cheddar Talk&gt;, &#39;Django Weblog&#39;: &lt;Blog: Django Weblog&gt;}</span>\n</code></pre></div>\n<p>En passant une liste vide à <code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk()</span></code>, le résultat est un dictionnaire vide.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.2\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>L’utilisation d’un champ distinct a été autorisé.</p>\n</aside>\n</section>\n<section id=\"iterator\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code><a class=\"heading-anchor\" href=\"#iterator\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.iterator\">\n<span class=\"sig-name descname\"><span class=\"pre\">iterator</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chunk_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">2000</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.iterator\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Évalue le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> (en exécutant la requête) et renvoie un itérateur (voir <span class=\"target\" id=\"index-7\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0234/\"><strong>PEP 234</strong></a>) sur les résultats. Un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> met typiquement en cache interne ses résultats afin que d’éventuelles autres évaluations ne produisent pas de requête supplémentaire. Au contraire, <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> lit directement les résultats, sans rien mettre dans le cache du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> (en interne, l’itérateur par défaut appelle <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> et met en cache la valeur renvoyée). Pour un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> renvoyant un grand nombre d’objets que vous ne devez accéder qu’une seule fois, cela peut amener à de meilleures performances et à une utilisation bien moindre de la mémoire.</p>\n<p>Notez que l’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> sur un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> ayant déjà été évalué force une nouvelle évaluation en répétant la requête.</p>\n<p>De plus, l’utilisation de``iterator()`` ignore d’éventuels appels précédents à <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code>, car il n’est pas logique de combiner ces deux optimisations.</p>\n<p>En fonction du moteur de base de données, les résultats de requête seront soit chargés entièrement en mémoire, soit livrés en flux depuis la base de données en utilisant des curseurs côté serveur.</p>\n<section id=\"with-server-side-cursors\">\n<h5>Avec des curseurs côté serveur<a class=\"heading-anchor\" href=\"#with-server-side-cursors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>Oracle et <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#postgresql-server-side-cursors\"><span class=\"std std-ref\">PostgreSQL</span></a> utilisent des curseurs côté serveur pour livrer en flux les résultats de la base de données sans charger l’entier du jeu de résultats en mémoire.</p>\n<p>Le pilote de base de données Oracle utilise toujours des curseurs côté serveur.</p>\n<p>Avec les curseurs côté serveur, le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> indique le nombre de résultats à mettre en cache au niveau du pilote de base de données. L’obtention de blocs plus gros diminue le nombre d’aller-retours entre le pilote de base de données et la base de données, au détriment de la mémoire.</p>\n<p>Avec PostgreSQL, les curseurs côté serveur ne sont utilisés que si le réglage <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DISABLE_SERVER_SIDE_CURSORS</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Lisez <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#transaction-pooling-server-side-cursors\"><span class=\"std std-ref\">Transactions groupées et curseurs côté serveur</span></a> si vous utilisez un concentrateur de connexions configuré en mode concentration de transaction. Lorsque les curseurs côté serveur sont désactivés, le comportement est le même que pour les bases de données qui ne prennent pas en charge ces curseurs.</p>\n</section>\n<section id=\"without-server-side-cursors\">\n<h5>Sans curseurs côté serveur<a class=\"heading-anchor\" href=\"#without-server-side-cursors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>MySQL ne prend pas en charge la diffusion de résultats, ce qui signifie que le pilote Python de cette base de données charge l’entier du jeu de résultats en mémoire. Ce jeu de résultats est ensuite transformé en objets lignes Python par l’adaptateur de base de données à l’aide de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">fetchmany()</span></code> définie dans la <span class=\"target\" id=\"index-8\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>.</p>\n<p>SQLite peut récupérer des résultats par lots avec <code class=\"docutils literal notranslate\"><span class=\"pre\">fetchmany()</span></code>, mais comme SQLite ne fournit pas d’isolation entre les requêtes à l’intérieur d’une connexion, soyez prudent lorsque vous écrivez dans la table qui est actuellement parcourue. Voir <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-isolation\"><span class=\"std std-ref\">Isolation lors de l’utilisation de QuerySet.iterator()</span></a> pour plus d’informations.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> contrôle la taille des lots que Django récupère du pilote de base de données. Des lots plus gros diminuent la surcharge de communication avec le pilote de base de données au détriment d’une légère augmentation de la consommation mémoire.</p>\n<p>La valeur par défaut de <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code>, 2000, provient d’un <a class=\"reference external\" href=\"https://www.postgresql.org/message-id/4D2F2C71.8080805%40dndg.it\">calcul sur la liste de diffusion psycopg</a>:</p>\n<blockquote>\n<div><p>En imaginant des lignes de 10-20 colonnes avec un mélange de données textuelles et numériques, 2000 va récupérer moins de 100 Ko de données, ce qui paraît un bon compromis entre le nombre de lignes transférées et les données à laisser tomber dans le cas d’une sortie prématurée de la boucle.</p>\n</div></blockquote>\n</section>\n</section>\n<section id=\"latest\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code><a class=\"heading-anchor\" href=\"#latest\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.latest\">\n<span class=\"sig-name descname\"><span class=\"pre\">latest</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.latest\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie le dernier objet de la table, en fonction du ou des champs indiqués.</p>\n<p>Cet exemple renvoie le dernier objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> de la table, selon le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il est aussi possible de choisir le dernier en fonction de plusieurs champs. Par exemple, pour choisir un <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> avec la date d’expiration la plus ancienne lorsque deux entrées ont la même date <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;-expire_date&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Le signe moins dans <code class=\"docutils literal notranslate\"><span class=\"pre\">'-expire_date'</span></code> indique que l’on veut trier <code class=\"docutils literal notranslate\"><span class=\"pre\">expire_date</span></code> dans l’ordre <em>décroissant</em>. Comme <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> obtient le dernier résultat, c’est l”<code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> avec la date <code class=\"docutils literal notranslate\"><span class=\"pre\">expire_date</span></code> la plus ancienne qui est choisie.</p>\n<p>Si la classe <a class=\"reference internal\" href=\"/fr/3.2/topics/db/models/#meta-options\"><span class=\"std std-ref\">Meta</span></a> d’un modèle définit <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code></a>, il est possible d’omettre tout paramètre dans <code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code>. Les champs définis dans <a class=\"reference internal\" href=\"/fr/3.2/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code></a> seront utilisés par défaut.</p>\n<p>Comme <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> génèrent <a class=\"reference internal\" href=\"/fr/3.2/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DoesNotExist</span></code></a> si aucun objet ne correspond aux paramètres donnés.</p>\n<p>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> n’existent que par commodité et pour une meilleure lisibilité.</p>\n<aside class=\"admonition-earliest-and-latest-may-return-instances-with-null-dates admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> peuvent renvoyer des instances avec des dates nulles.</p>\n<p>Comme le tri est délégué à la base de données, les résultats des champs qui autorisent les valeurs nulles peuvent être triés différemment en fonction de la base de données. Par exemple, PostgreSQL et MySQL trient les valeurs nulles comme si elles étaient plus élevées que les valeurs non nulles, alors que SQLite fait l’inverse.</p>\n<p>Il peut être souhaitable d’exclure les valeurs nulles :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__isnull</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"earliest\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code><a class=\"heading-anchor\" href=\"#earliest\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.earliest\">\n<span class=\"sig-name descname\"><span class=\"pre\">earliest</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\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.earliest\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fonctionne comme <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.latest\" title=\"django.db.models.query.QuerySet.latest\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">latest()</span></code></a>, mais dans le sens inverse.</p>\n</section>\n<section id=\"first\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">first()</span></code><a class=\"heading-anchor\" href=\"#first\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.first\">\n<span class=\"sig-name descname\"><span class=\"pre\">first</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.first\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie le premier objet du jeu de requête, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> si la requête est vide. Si l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> n’est pas trié, la requête est automatiquement triée selon la clé primaire. Cela peut affecter les résultats d’agrégats comme expliqué dans <a class=\"reference internal\" href=\"/fr/3.2/topics/db/aggregation/#aggregation-ordering-interaction\"><span class=\"std std-ref\">Interaction avec order_by()</span></a>.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">first</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">first()</span></code> est une méthode d’agrément ; l’extrait de code suivant est équivalent à l’exemple ci-dessus :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">except</span> <span class=\"ne\">IndexError</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n</section>\n<section id=\"last\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">last()</span></code><a class=\"heading-anchor\" href=\"#last\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.last\">\n<span class=\"sig-name descname\"><span class=\"pre\">last</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.last\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fonctionne comme <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.first\" title=\"django.db.models.query.QuerySet.first\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">first()</span></code></a>, mais renvoie le dernier objet du jeu de requête.</p>\n</section>\n<section id=\"aggregate\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code><a class=\"heading-anchor\" href=\"#aggregate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aggregate\">\n<span class=\"sig-name descname\"><span class=\"pre\">aggregate</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\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aggregate\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un dictionnaire de valeurs agrégées (moyennes, sommes, etc.) calculées dans le <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Chaque paramètre d”<code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> définit une valeur qui sera incluse dans le dictionnaire renvoyé.</p>\n<p>Les fonctions d’agrégation fournies par Django sont décrites plus loin dans <a class=\"reference internal\" href=\"#id5\">Fonctions d’agrégation</a>. Comme les agrégations sont aussi des <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/\"><span class=\"doc\">expressions de requête</span></a>, il est possible de combiner des agrégations avec d’autres agrégations ou valeurs afin de créer des agrégations complexes.</p>\n<p>Les agrégations spécifiées par des paramètres nommés utilisent la clé comme nom d’annotation. Les paramètres anonymes seront dotés d’un nom généré automatiquement sur la base du nom de la fonction d’agrégation et du champ de modèle sur lequel porte l’agrégation. Les agrégations complexes ne peuvent pas utiliser de paramètres anonymes et doivent indiquer un paramètre nommé jouant le rôle d’alias.</p>\n<p>Par exemple, si vous avez affaire à des articles de blog, il peut être intéressant de déterminer le nombre d’auteurs ayant écrits des articles :</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\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;entry__count&#39;: 16}</span>\n</code></pre></div>\n<p>En utilisant un paramètre nommé pour définir la fonction d’agrégation, vous pouvez contrôler le nom de la valeur d’agrégation dans le résultat :</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\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">number_of_entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;entry&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;number_of_entries&#39;: 16}</span>\n</code></pre></div>\n<p>Pour une présentation approfondie de l’agrégation, consultez le <a class=\"reference internal\" href=\"/fr/3.2/topics/db/aggregation/\"><span class=\"doc\">guide thématique sur l’agrégation</span></a>.</p>\n</section>\n<section id=\"exists\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exists()</span></code><a class=\"heading-anchor\" href=\"#exists\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exists\">\n<span class=\"sig-name descname\"><span class=\"pre\">exists</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exists\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> si le <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> contient au moins un résultat, sinon <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Cette méthode s’efforce de lancer la requête la plus simple et rapide possible, mais la requête exécutée est <em>quasi identique</em> à celle du <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> normal.</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a> est utile pour des recherches liées à l’appartenance d’objets dans un <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> et à l’existence d’au moins un objet dans un <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a>, particulièrement dans le contexte de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> volumineux.</p>\n<p>La méthode la plus efficace pour déterminer si un modèle avec un champ unique (par ex. sa clé primaire) est présent dans un <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> est :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">123</span><span class=\"p\">)</span>\n<span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce qui sera plus rapide que l’exemple suivant qui demande l’évaluation et l’itération de la totalité du jeu de requête :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">entry</span> <span class=\"ow\">in</span> <span class=\"n\">some_queryset</span><span class=\"p\">:</span>\n   <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in QuerySet&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Et pour savoir si un jeu de requête contient au moins un élément :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce qui sera plus rapide que :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…mais pas de beaucoup (plus le jeu de requête est potentiellement volumineux, plus le gain sera élevé).</p>\n<p>De plus, si <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset</span></code> n’a pas encore été évalué mais que vous savez qu’il le sera à un moment donné, l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset.exists()</span></code> effectue du travail en plus (une requête pour le contrôle d’existence, plus une autre plus tard au moment de charger les résultats) par rapport à <code class=\"docutils literal notranslate\"><span class=\"pre\">bool(some_queryset)</span></code>, qui récupère les résultats et vérifie ensuite s’il y en a au moins un.</p>\n</section>\n<section id=\"update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code><a class=\"heading-anchor\" href=\"#update\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update\">\n<span class=\"sig-name descname\"><span class=\"pre\">update</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\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Effectue une requête de mise à jour SQL pour les champs indiqués et renvoie le nombre de lignes affectées (qui n’est pas forcément égal au nombre de lignes mises à jour dans la mesure où certaines lignes possèdent déjà la nouvelle valeur).</p>\n<p>Par exemple, pour désactiver les commentaires pour tous les articles de blog publiés en 2010, vous pourriez écrire 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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(En supposant que votre modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> contienne les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">comments_on</span></code>.)</p>\n<p>Vous pouvez mettre à jour plusieurs champs ; il n’y a pas de limite. Dans l’exemple suivant, nous mettons à jour les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">comments_on</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is old&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> est appliquée immédiatement et la seule restriction sur le <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> de mise à jour est qu’il ne peut mettre à jour que des colonnes de la table principale du modèle, pas dans des modèles liés. Par exemple, ceci n’est pas possible :</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">blog__name</span><span class=\"o\">=</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># Won&#39;t work!</span>\n</code></pre></div>\n<p>Le filtrage basé sur des champs liés est cependant toujours possible :</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Vous ne pouvez pas appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> sur un <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> qui a subi une segmentation ou qui ne peut plus être filtré pour une autre raison.</p>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> renvoie le nombre de lignes affectées :</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\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">1</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">slug</span><span class=\"o\">=</span><span class=\"s1\">&#39;nonexistent-slug&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">0</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">132</span>\n</code></pre></div>\n<p>Si vous n’avez qu’une ligne à mettre à jour et que vous n’avez rien à faire de spécial avec l’objet modèle, l’approche la plus efficace est d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code>, plutôt que de charger en mémoire l’objet modèle. Par exemple, au lieu de 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=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">comments_on</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n<span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>…faites ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’utilisation d”<code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> permet aussi d’éviter une situation de concurrence où le contenu en base de données pourrait être modifié dans le court intervalle entre le chargement de l’objet et l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>.</p>\n<p>Finalement, réalisez que <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> effectue la mise à jour au niveau SQL et par conséquent, n’appelle pas la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> des modèles et n’émet pas non plus les signaux <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> (qui sont une conséquence de l’appel à <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code></a>). Si vous souhaitez mettre à jour un certain nombre d’objets d’un modèle possédant une méthode <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> personnalisée, passez-les dans une boucle en appelant <a class=\"reference internal\" href=\"/fr/3.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">):</span>\n    <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">comments_on</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"ordered-queryset\">\n<h5>Jeux de requête triés<a class=\"heading-anchor\" href=\"#ordered-queryset\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h5>\n<aside class=\"version-note version-added\" data-version=\"3.2\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>L’enchaînement de <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> avec <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> n’est pris en charge que pour MariaDB et MySQL et est ignoré pour les autres bases de données. Ceci peut être utile pour mettre à jour un champ unique dans l’ordre qui est indiqué sans conflit. Par exemple</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-number&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">number</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;number&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>La clause <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> sera ignorée si elle contient des annotations, des champs hérités ou des expressions de requête traversant des relations.</p>\n</aside>\n</section>\n</section>\n<section id=\"delete\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code><a class=\"heading-anchor\" href=\"#delete\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.delete\">\n<span class=\"sig-name descname\"><span class=\"pre\">delete</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.delete\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Effectue une requête de suppression SQL de toutes les lignes de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> et renvoie le nombre d’objets supprimés ainsi qu’un dictionnaire avec le nombre de suppressions par type d’objet.</p>\n<p>La suppression <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> s’applique immédiatement. Vous ne pouvez pas appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> sur un <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> qui a subi une segmentation ou qui ne peut plus être filtré pour une autre raison.</p>\n<p>Par exemple, pour supprimer tous les articles d’un blog particulier :</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\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Delete all the entries belonging to this Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"go\">(4, {&#39;weblog.Entry&#39;: 2, &#39;weblog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>Par défaut, les champs <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> de Django émulent le comportement de la contrainte SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span> <span class=\"pre\">DELETE</span> <span class=\"pre\">CASCADE</span></code>. En d’autres termes, tout objet possédant des clés étrangères vers les objets en cours de suppression seront également supprimés. Par exemple :</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\">blogs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"go\"># This will delete all Blogs and all of their Entry objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">blogs</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"go\">(5, {&#39;weblog.Blog&#39;: 1, &#39;weblog.Entry&#39;: 2, &#39;weblog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>Ce comportement en cascade peut être personnalisé par le paramètre <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a> de <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>.</p>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> supprime en vrac et n’appelle pas la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> des modèles. Par contre, elle émet les signaux <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.2/ref/signals/#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_delete</span></code></a> pour tous les objets supprimés (y compris les suppressions en cascade).</p>\n<p>Django a besoin de charger les objets en mémoire pour envoyer les signaux et gérer les suppressions en cascade. Cependant, s’il n’y a pas d’objets en cascade ni de signaux, Django se permet de choisir une voie rapide et de supprimer les objets sans les charger en mémoire. Pour des grosses suppressions, cela peut réduire considérablement la consommation mémoire. Le nombre de requêtes exécutées peut également être plus faible.</p>\n<p>Les clés étrangères dont le paramètre <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">DO_NOTHING</span></code> (ne rien faire) n’empêchent pas la suppression accélérée.</p>\n<p>Notez que les requêtes générées lors de la suppression d’objets constituent un détail d’implémentation susceptible d’être modifié.</p>\n</section>\n<section id=\"as-manager\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">as_manager()</span></code><a class=\"heading-anchor\" href=\"#as-manager\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.as_manager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">as_manager</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.as_manager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Méthode de classe qui renvoie une instance de <a class=\"reference internal\" href=\"/fr/3.2/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a> avec une copie des méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Voir <a class=\"reference internal\" href=\"/fr/3.2/topics/db/managers/#create-manager-with-queryset-methods\"><span class=\"std std-ref\">Création d’objet Manager avec des méthodes de QuerySet</span></a> pour plus de détails.</p>\n</section>\n<section id=\"explain\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">explain()</span></code><a class=\"heading-anchor\" href=\"#explain\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.explain\">\n<span class=\"sig-name descname\"><span class=\"pre\">explain</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">format</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\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.explain\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie une chaîne contenant le plan d’exécution de la requête <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, qui présente comment la base de données va exécuter la requête, y compris les index ou jointures qui seraient utilisés. La connaissance de ces détails peut aider à améliorer les performances des requêtes lentes.</p>\n<p>Par exemple, avec PostgreSQL</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=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;My Blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">explain</span><span class=\"p\">())</span>\n<span class=\"go\">Seq Scan on blog  (cost=0.00..35.50 rows=10 width=12)</span>\n<span class=\"go\">  Filter: (title = &#39;My Blog&#39;::bpchar)</span>\n</code></pre></div>\n<p>Le résultat diffère significativement entre les base de données.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">explain()</span></code> est pris en charge par tous les moteurs de base de données intégrés à l’exception d’Oracle car une implémentation pour ce dernier n’est pas évidente.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">format</span></code> modifie le format de sortie par rapport au format par défaut des bases de données, qui est habituellement sous forme de texte. PostgreSQL prend en charge les formats <code class=\"docutils literal notranslate\"><span class=\"pre\">'TEXT'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'JSON'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'YAML'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'XML'</span></code>. MariaDB et MySQL prennent en charge les formats <code class=\"docutils literal notranslate\"><span class=\"pre\">'TEXT'</span></code> (aussi appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">'TRADITIONAL'</span></code>) et <code class=\"docutils literal notranslate\"><span class=\"pre\">'JSON'</span></code>. MySQL 8.0.16+ prend aussi en charge un format <code class=\"docutils literal notranslate\"><span class=\"pre\">'TREE'</span></code> amélioré, qui est semblable au format de sortie <code class=\"docutils literal notranslate\"><span class=\"pre\">'TEXT'</span></code> de PostgreSQL et qui est utilisé par défaut s’il est pris en charge.</p>\n<p>Certaines bases de données acceptent des options pouvant renvoyer plus d’informations sur la requête. Passez ces options sous forme de paramètres nommés. Par exemple, avec PostgreSQL</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=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;My Blog&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">explain</span><span class=\"p\">(</span><span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">analyze</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n<span class=\"go\">Seq Scan on public.blog  (cost=0.00..35.50 rows=10 width=12) (actual time=0.004..0.004 rows=10 loops=1)</span>\n<span class=\"go\">  Output: id, title</span>\n<span class=\"go\">  Filter: (blog.title = &#39;My Blog&#39;::bpchar)</span>\n<span class=\"go\">Planning time: 0.064 ms</span>\n<span class=\"go\">Execution time: 0.058 ms</span>\n</code></pre></div>\n<p>Avec certaines bases de données, des options peuvent produire l’exécution de la requête, ce qui pourrait avoir des effets non désirables sur la base de données. Par exemple, l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">ANALYZE</span></code> prise en charge par MariaDB, MySQL 8.0.18+ et PostgreSQL pourrait aboutir à des modifications de données s’il existe des déclencheurs (triggers) ou si une fonction est appelée, même pour une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Les prises en charge du format <code class=\"docutils literal notranslate\"><span class=\"pre\">'TREE'</span></code> pour MySQL 8.0.16+ et de l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">analyze</span></code> avec MariaDB et MySQL 8.0.18+ ont été ajoutées.</p>\n</aside>\n</section>\n</section>\n<section id=\"field-lookups\">\n<span id=\"id4\"></span><h3>Recherches dans les champs<a class=\"heading-anchor\" href=\"#field-lookups\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La recherche dans les champs est ce qui constitue le cœur des clauses SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code>. La syntaxe s’exprime par des paramètres nommés dans les méthodes <a class=\"reference internal\" href=\"#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>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> de <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Pour une introduction sur ce sujet, consultez la <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">documentation sur les requêtes de modèles et de base de données</span></a>.</p>\n<p>Les recherches fournies par Django sont présentées ci-dessous. Il est également possible d’écrire des <a class=\"reference internal\" href=\"/fr/3.2/howto/custom-lookups/\"><span class=\"doc\">recherches personnalisées</span></a> pour les champs de modèles.</p>\n<p>Par commodité, lorsqu’aucune recherche particulière n’est indiquée (comme dans <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry.objects.get(id=14)</span></code>), Django suppose que la recherche souhaitée est <a class=\"reference internal\" href=\"#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">exact</span></code></a>.</p>\n<section id=\"exact\">\n<span id=\"std-fieldlookup-exact\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code><a class=\"heading-anchor\" href=\"#exact\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Correspondance exacte. Si la valeur fournie pour la comparaison vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, elle sera interprétée comme un <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> SQL (voir <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">isnull</span></code></a> pour plus de détails).</p>\n<p>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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">id__exact</span><span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">id__exact</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalence en SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">14</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-mysql-comparisons admonition\">\n<p class=\"admonition-title\">Comparaisons MySQL</p>\n<p>Avec MySQL, le paramètre « collation » d’une table de base de données détermine si les comparaisons <code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code> sont sensibles à la casse. Il s’agit d’un réglage de base de données, <em>pas</em> de Django. Il est possible de configurer vos tables MySQL afin qu’elles utilisent des comparaisons sensibles à la casse, mais cela implique certains compromis. Pour plus d’informations à ce sujet, consultez la <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#mysql-collation\"><span class=\"std std-ref\">section collation</span></a> dans la documentation des <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/\"><span class=\"doc\">bases de données</span></a>.</p>\n</aside>\n</section>\n<section id=\"iexact\">\n<span id=\"std-fieldlookup-iexact\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iexact</span></code><a class=\"heading-anchor\" href=\"#iexact\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Correspondance exacte insensible à la casse. Si la valeur fournie pour la comparaison vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, elle sera interprétée comme un <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> SQL (voir <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">isnull</span></code></a> pour plus de détails).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name__iexact</span><span class=\"o\">=</span><span class=\"s1\">&#39;beatles blog&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name__iexact</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalence en SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;beatles blog&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">'Beatles</span> <span class=\"pre\">Blog'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'beatles</span> <span class=\"pre\">blog'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'BeAtLes</span> <span class=\"pre\">BLoG'</span></code>, etc. correspondent tous à la première recherche.</p>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>Lors de l’utilisation du moteur SQLite et de chaînes non ASCII, il faut tenir compte des <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de base de données</span></a> au sujet de la comparaison de chaînes. SQLite n’effectue pas de recherches insensibles à la casse pour des chaînes non ASCII.</p>\n</aside>\n</section>\n<section id=\"contains\">\n<span id=\"std-fieldlookup-contains\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code><a class=\"heading-anchor\" href=\"#contains\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Test d’inclusion sensible à la casse.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Notez que le titre (<code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code>) <code class=\"docutils literal notranslate\"><span class=\"pre\">'Lennon</span> <span class=\"pre\">honored</span> <span class=\"pre\">today'</span></code> correspondrait à cette recherche, mais pas <code class=\"docutils literal notranslate\"><span class=\"pre\">'lennon</span> <span class=\"pre\">honored</span> <span class=\"pre\">today'</span></code>.</p>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>SQLite ne prend pas en charge les instructions <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> sensibles à la casse ; <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> se comporte comme <code class=\"docutils literal notranslate\"><span class=\"pre\">icontains</span></code> pour SQLite. Consultez les <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de bases de données</span></a> pour plus d’informations.</p>\n</aside>\n</section>\n<section id=\"icontains\">\n<span id=\"std-fieldlookup-icontains\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">icontains</span></code><a class=\"heading-anchor\" href=\"#icontains\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Test d’inclusion insensible à la casse.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__icontains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>Lors de l’utilisation du moteur SQLite et de chaînes non ASCII, il faut tenir compte des <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de base de données</span></a> au sujet de la comparaison de chaînes.</p>\n</aside>\n</section>\n<section id=\"in\">\n<span id=\"std-fieldlookup-in\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code><a class=\"heading-anchor\" href=\"#in\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Dans un itérable donné ; souvent une liste, un tuple ou un jeu de requête. Ce n’est pas courant, mais des chaînes (qui sont aussi des itérables) sont acceptées.</p>\n<p>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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">id__in</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">])</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__in</span><span class=\"o\">=</span><span class=\"s1\">&#39;abc&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalence en SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">);</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;c&#39;</span><span class=\"p\">);</span>\n</code></pre></div>\n<p>Vous pouvez également utiliser un jeu de requête pour évaluer dynamiquement la liste des valeurs au lieu de fournir une liste de valeurs littérales :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Cheddar&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce jeu de requête sera évalué sous forme d’instruction de sous-sélection :</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=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">blog</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">NAME</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Cheddar%&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous fournissez un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> résultant d’un appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> ou à <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> comme valeur d’une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">__in</span></code>, vous devez vous assurer que vous extrayez un seul champ du résultat. Par exemple, ceci fonctionnera (filtrage sur les noms de blogs) :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Ch&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__name__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cet exemple générera une exception, car la requête imbriquée extrait deux valeurs de champ, alors qu’il n’en faut qu’une seule :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Bad code! Will raise a TypeError.</span>\n<span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Ch&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__name__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-performance-considerations admonition\" id=\"nested-queries-performance\">\n<p class=\"admonition-title\">Considérations sur la performance</p>\n<p>Soyez prudent avec les requêtes imbriquées ; il s’agit de bien comprendre les enjeux au niveau des performances du serveur de base de données (en cas de doute, faites des tests de performance). Certains moteurs de base de données, plus particulièrement MySQL, n’optimisent pas très bien les sous-requêtes. Dans ces situations, il est plus efficace d’extraire les valeurs sous forme de liste puis de les transmettre à la seconde requête. En clair, effectuer deux requêtes au lieu d’une seule :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">values</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n        <span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;Cheddar&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__in</span><span class=\"o\">=</span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Remarquez l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">list()</span></code> autour du <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> Blog pour forcer l’exécution de la première requête. Sans cela, une sous-requête serait exécutée, car <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">Les objects QuerySet sont différés</span></a>.</p>\n</aside>\n</section>\n<section id=\"gt\">\n<span id=\"std-fieldlookup-gt\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gt</span></code><a class=\"heading-anchor\" href=\"#gt\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Plus grand que.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">id__gt</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">;</span>\n</code></pre></div>\n</section>\n<section id=\"gte\">\n<span id=\"std-fieldlookup-gte\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gte</span></code><a class=\"heading-anchor\" href=\"#gte\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Plus grand ou égal à.</p>\n</section>\n<section id=\"lt\">\n<span id=\"std-fieldlookup-lt\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">lt</span></code><a class=\"heading-anchor\" href=\"#lt\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Plus petit que.</p>\n</section>\n<section id=\"lte\">\n<span id=\"std-fieldlookup-lte\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">lte</span></code><a class=\"heading-anchor\" href=\"#lte\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Plus petit ou égal à.</p>\n</section>\n<section id=\"startswith\">\n<span id=\"std-fieldlookup-startswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code><a class=\"heading-anchor\" href=\"#startswith\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Commence par (sensible à la casse).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>SQLite ne prend pas en charge les instructions <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> sensibles à la casse ; <code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code> se comporte comme <code class=\"docutils literal notranslate\"><span class=\"pre\">istartswith</span></code> pour SQLite.</p>\n</section>\n<section id=\"istartswith\">\n<span id=\"std-fieldlookup-istartswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">istartswith</span></code><a class=\"heading-anchor\" href=\"#istartswith\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Commence par (non sensible à la casse).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__istartswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>Lors de l’utilisation du moteur SQLite et de chaînes non ASCII, il faut tenir compte des <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de base de données</span></a> au sujet de la comparaison de chaînes.</p>\n</aside>\n</section>\n<section id=\"endswith\">\n<span id=\"std-fieldlookup-endswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">endswith</span></code><a class=\"heading-anchor\" href=\"#endswith\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se termine par (sensible à la casse).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__endswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>SQLite ne prend pas en charge les instructions <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> sensibles à la casse ; <code class=\"docutils literal notranslate\"><span class=\"pre\">endswith</span></code> se comporte comme <code class=\"docutils literal notranslate\"><span class=\"pre\">iendswith</span></code> pour SQLite. Consultez les <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de bases de données</span></a> pour plus d’informations.</p>\n</aside>\n</section>\n<section id=\"iendswith\">\n<span id=\"std-fieldlookup-iendswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iendswith</span></code><a class=\"heading-anchor\" href=\"#iendswith\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se termine par (non sensible à la casse).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__iendswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon&#39;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>Lors de l’utilisation du moteur SQLite et de chaînes non ASCII, il faut tenir compte des <a class=\"reference internal\" href=\"/fr/3.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">notes de base de données</span></a> au sujet de la comparaison de chaînes.</p>\n</aside>\n</section>\n<section id=\"range\">\n<span id=\"std-fieldlookup-range\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code><a class=\"heading-anchor\" href=\"#range\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Test d’intervalle (inclusif).</p>\n<p>Exemple :</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\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"n\">start_date</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</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=\"n\">end_date</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__range</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">start_date</span><span class=\"p\">,</span> <span class=\"n\">end_date</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"w\"> </span><span class=\"k\">and</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-03-31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code> partout là ou vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">BETWEEN</span></code> en SQL — pour les dates, les nombres et même les caractères.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Le filtrage sur un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code> avec des dates n’inclura pas les objets du dernier jour, car les limites sont interprétées comme « minuit à la date indiquée ». Si <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> était un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code>, l’expression ci-dessus correspondrait au code SQL suivant :</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=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01 00:00:00&#39;</span><span class=\"w\"> </span><span class=\"k\">and</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-03-31 00:00:00&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>De manière générale, il n’est pas possible de mélanger des objets dates et dates/heures.</p>\n</aside>\n</section>\n<section id=\"date\">\n<span id=\"std-fieldlookup-date\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code><a class=\"heading-anchor\" href=\"#date\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date/heure, force la valeur à une date. Cette expression peut être suivie d’autres expressions de champs. Accepte une valeur date.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__date</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"year\">\n<span id=\"std-fieldlookup-year\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">year</span></code><a class=\"heading-anchor\" href=\"#year\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance exacte de l’année. Cette expression peut être suivie d’autres expressions de champs. Accepte une année comme nombre entier.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year__gte</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-12-31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"iso-year\">\n<span id=\"std-fieldlookup-iso_year\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iso_year</span></code><a class=\"heading-anchor\" href=\"#iso-year\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance exacte de l’année avec numéros de semaine ISO 8601. Cette expression peut être suivie d’autres expressions de champs. Accepte une année comme nombre entier.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_year__gte</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"month\">\n<span id=\"std-fieldlookup-month\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">month</span></code><a class=\"heading-anchor\" href=\"#month\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance exacte du mois. Cette expression peut être suivie d’autres expressions de champs. Accepte un nombre entier, de 1 (janvier) à 12 (décembre).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__month</span><span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__month__gte</span><span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;6&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"day\">\n<span id=\"std-fieldlookup-day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">day</span></code><a class=\"heading-anchor\" href=\"#day\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance exacte du jour. Cette expression peut être suivie d’autres expressions de champs. Accepte un jour comme nombre entier.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__day</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__day__gte</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Notez que cela correspond à tout élément dont le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est égal au troisième jour du mois, comme le 3 janvier, le 3 juillet, etc.</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"week\">\n<span id=\"std-fieldlookup-week\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">week</span></code><a class=\"heading-anchor\" href=\"#week\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour des champs date et date/heure, renvoie le numéro de semaine (1-52 ou 53) selon <a class=\"reference external\" href=\"https://fr.wikipedia.org/wiki/ISO_8601\">ISO-8601</a>, c’est-à-dire que les semaines commencent un lundi et que la première semaine contient le premier jeudi de l’année.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week</span><span class=\"o\">=</span><span class=\"mi\">52</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week__gte</span><span class=\"o\">=</span><span class=\"mi\">32</span><span class=\"p\">,</span> <span class=\"n\">pub_date__week__lte</span><span class=\"o\">=</span><span class=\"mi\">38</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"week-day\">\n<span id=\"std-fieldlookup-week_day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">week_day</span></code><a class=\"heading-anchor\" href=\"#week-day\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance exacte du « jour de la semaine ». Cette expression peut être suivie d’autres expressions de champs.</p>\n<p>Accepte un nombre entier représentant le jour de la semaine, de 1 (dimanche) à 7 (samedi).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week_day</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week_day__gte</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Notez que cela correspond à tout élément dont le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est un lundi (jour 2 de la semaine), sans tenir compte du mois ou de l’année. Les jours de la semaine sont indexés de 1 (dimanche) à 7 (samedi).</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"iso-week-day\">\n<span id=\"std-fieldlookup-iso_week_day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iso_week_day</span></code><a class=\"heading-anchor\" href=\"#iso-week-day\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"3.1\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>Pour les champs date et date/heure, une correspondance exacte du jour de la semaine ISO 8601. Cette expression peut être suivie d’autres expressions de champs.</p>\n<p>Accepte un nombre entier représentant le jour de la semaine, de 1 (lundi) à 7 (dimanche).</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_week_day</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_week_day__gte</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Notez que cela correspond à tout élément dont le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est un lundi (jour 2 de la semaine), sans tenir compte du mois ou de l’année. Les jours de la semaine sont indexés de 1 (lundi) à 7 (dimanche).</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"quarter\">\n<span id=\"std-fieldlookup-quarter\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">quarter</span></code><a class=\"heading-anchor\" href=\"#quarter\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date et date/heure, une correspondance de « trimestre annuel ». Cette expression peut être suivie d’autres expressions de champs. Accepte une valeur nombre entier entre 1 et 4 représentant le trimestre de l’année.</p>\n<p>Exemple pour obtenir les lignes du deuxième trimestre (1er avril au 30 juin)</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__quarter</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"time\">\n<span id=\"std-fieldlookup-time\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">time</span></code><a class=\"heading-anchor\" href=\"#time\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date/heure, force la valeur à une heure. Cette expression peut être suivie d’autres expressions de champs. Accepte une valeur <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.time</span></code></a>.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__time</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">))</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__time__range</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">),</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">17</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>(Nous n’avons pas inclus de code SQL équivalent pour cette recherche car l’implémentation de la requête correspondante varie beaucoup selon le moteur de base de données.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"hour\">\n<span id=\"std-fieldlookup-hour\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">hour</span></code><a class=\"heading-anchor\" href=\"#hour\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date/heure et heure, une correspondance exacte de l’heure. Cette expression peut être suivie d’autres expressions de champs. Accepte un nombre entier entre 0 et 23.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__hour</span><span class=\"o\">=</span><span class=\"mi\">23</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__hour</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__hour__gte</span><span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;23&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;5&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"minute\">\n<span id=\"std-fieldlookup-minute\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">minute</span></code><a class=\"heading-anchor\" href=\"#minute\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date/heure et heure, une correspondance exacte de la minute. Cette expression peut être suivie d’autres expressions de champs. Accepte un nombre entier entre 0 et 59.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__minute</span><span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__minute</span><span class=\"o\">=</span><span class=\"mi\">46</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__minute__gte</span><span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;46&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"second\">\n<span id=\"std-fieldlookup-second\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">second</span></code><a class=\"heading-anchor\" href=\"#second\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour les champs date/heure et heure, une correspondance exacte de la seconde. Cette expression peut être suivie d’autres expressions de champs. Accepte un nombre entier entre 0 et 59.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__second</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__second</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__second__gte</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;2&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>(La syntaxe SQL exacte varie d’un moteur de base de données à l’autre.)</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les champs date/heure sont convertis dans le fuseau horaire en cours avant le filtrage. Cela nécessite la présence des <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">définitions de fuseaux horaires dans la base de données</span></a>.</p>\n</section>\n<section id=\"isnull\">\n<span id=\"std-fieldlookup-isnull\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">isnull</span></code><a class=\"heading-anchor\" href=\"#isnull\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Accepte <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, ce qui correspond respectivement aux instructions SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">IS</span> <span class=\"pre\">NULL</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">IS</span> <span class=\"pre\">NOT</span> <span class=\"pre\">NULL</span></code>.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__isnull</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalent SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"version-note version-deprecated\" data-version=\"3.1\">\n<p class=\"version-note-title\">Deprecated since Django 3.1</p><p><span class=\"versionmodified deprecated\">Obsolète depuis la version 3.1: </span>L’utilisation de valeurs non booléennes dans la partie droite est obsolète, utilisez plutôt <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Dans Django 4.0, une exception sera produite dans ce cas.</p>\n</aside>\n</section>\n<section id=\"regex\">\n<span id=\"std-fieldlookup-regex\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">regex</span></code><a class=\"heading-anchor\" href=\"#regex\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Recherche par expression régulière, sensible à la casse.</p>\n<p>La syntaxe d’expression régulière est celle du moteur de base de données utilisé. Pour SQLite qui ne prend pas en charge nativement les expressions régulières, cette fonctionnalité est fournie par une fonction (Python) <code class=\"docutils literal notranslate\"><span class=\"pre\">REGEXP</span></code> définie par l’utilisateur, et la syntaxe d’expression régulière est par conséquent celle du module <code class=\"docutils literal notranslate\"><span class=\"pre\">re</span></code> de Python.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">title__regex</span><span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalence en SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"nb\">BINARY</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">REGEXP_LIKE</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;c&#39;</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n<p>Il est recommandé d’utiliser des chaînes brutes (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">r'foo'</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">'foo'</span></code>) pour transmettre des expressions régulières.</p>\n</section>\n<section id=\"iregex\">\n<span id=\"std-fieldlookup-iregex\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iregex</span></code><a class=\"heading-anchor\" href=\"#iregex\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Recherche par expression régulière, insensible à la casse.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">title__iregex</span><span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Équivalence en SQL :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">REGEXP_LIKE</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;i&#39;</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">~*</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;(?i)^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"aggregation-functions\">\n<span id=\"id5\"></span><h3>Fonctions d’agrégation<a class=\"heading-anchor\" href=\"#aggregation-functions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django fournit les fonctions d’agrégation suivantes dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models</span></code>. Pour plus de détails sur l’usage de ces fonctions, consultez le <a class=\"reference internal\" href=\"/fr/3.2/topics/db/aggregation/\"><span class=\"doc\">guide thématique sur l’agrégation</span></a>. Consultez la documentation de <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.Aggregate\" title=\"django.db.models.Aggregate\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Aggregate</span></code></a> pour apprendre à créer vos propres agrégations.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>SQLite ne sait pas nativement gérer des agrégations sur des champs date/heure. La raison est qu’il n’existe pas de vrais champs date/heure dans SQLite et que Django émule actuellement ces fonctions en utilisant un champ texte. Si vous essayez d’effectuer des agrégations sur des champs date/heure avec SQLite, vous obtiendrez l’exception <code class=\"docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code>.</p>\n</aside>\n<aside class=\"admonition-note admonition\">\n<p class=\"admonition-title\">Note</p>\n<p>Les fonctions d’agrégation renvoient <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> lorsqu’elles sont utilisées avec un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> vide. Par exemple, la fonction d’agrégation <code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code> (somme) renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> si le jeu de requête ne contient pas d’élément. Une exception est <code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></code>, qui renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> quand le jeu de requête est vide.</p>\n</aside>\n<p>Toutes les agrégations partagent les paramètres suivants :</p>\n<section id=\"expressions\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">expressions</span></code><a class=\"heading-anchor\" href=\"#expressions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Des chaînes référençant des champs du modèle, des transformations du champ ou des <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/\"><span class=\"doc\">expressions de requête</span></a>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.2\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>La prise en charge des champs avec transformation a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"output-field\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code><a class=\"heading-anchor\" href=\"#output-field\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Un paramètre facultatif représentant le <a class=\"reference internal\" href=\"/fr/3.2/ref/models/fields/\"><span class=\"doc\">champ de modèle</span></a> de la valeur renvoyée.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Lors de la combinaison de plusieurs types de champs, Django ne peut déterminer le type de résultat <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> qui si tous les champs sont du même type. Sinon, vous devez indiquer <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> vous-même.</p>\n</aside>\n</section>\n<section id=\"aggregate-filter\">\n<span id=\"id6\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code><a class=\"heading-anchor\" href=\"#aggregate-filter\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Un <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">objet</span> <span class=\"pre\">Q</span></code></a> facultatif utilisé pour filtrer les lignes qui ont été agrégées.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/3.2/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">Agrégation conditionnelle</span></a> et <a class=\"reference internal\" href=\"/fr/3.2/topics/db/aggregation/#filtering-on-annotations\"><span class=\"std std-ref\">Filtrage sur les annotations</span></a> pour des exemples d’utilisation.</p>\n</section>\n<section id=\"id7\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">**extra</span></code><a class=\"heading-anchor\" href=\"#id7\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Paramètres nommés qui peuvent fournir du contexte supplémentaire pour le code SQL généré par l’agrégation.</p>\n</section>\n<section id=\"avg\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Avg</span></code><a class=\"heading-anchor\" href=\"#avg\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Avg\">\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\">Avg</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Avg\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la valeur moyenne de l’expression indiquée, qui doit être de type numérique, sauf si vous indiquez un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> différent.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__avg</span></code></p></li>\n<li><p>Type de la valeur renvoyée : <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> si la valeur d’entrée est <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>, sinon identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Avg.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Avg.distinct\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Avg</span></code> renvoie la valeur moyenne de valeurs uniques. Cela correspond au code SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">AVG(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"id8\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></code><a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Count\">\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\">Count</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Count\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie le nombre d’objets liés au travers de l’expression indiquée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__count</span></code></p></li>\n<li><p>Type de la valeur renvoyée : <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code></p></li>\n</ul>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Count.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Count.distinct\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>, le dénombrement ne tient compte que des instances uniques. Cela correspond au code SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">COUNT(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"max\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Max</span></code><a class=\"heading-anchor\" href=\"#max\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Max\">\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\">Max</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Max\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la valeur maximale de l’expression donnée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__max</span></code></p></li>\n<li><p>Type de la valeur renvoyée : identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"min\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Min</span></code><a class=\"heading-anchor\" href=\"#min\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Min\">\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\">Min</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Min\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la valeur minimale de l’expression donnée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__min</span></code></p></li>\n<li><p>Type de la valeur renvoyée : identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"stddev\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">StdDev</span></code><a class=\"heading-anchor\" href=\"#stddev\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StdDev\">\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\">StdDev</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">sample</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.StdDev\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la déviation standard des données contenues dans l’expression donnée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__stddev</span></code></p></li>\n<li><p>Type de la valeur renvoyée : <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> si la valeur d’entrée est <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>, sinon identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StdDev.sample\">\n<span class=\"sig-name descname\"><span class=\"pre\">sample</span></span><a class=\"heading-anchor\" href=\"#django.db.models.StdDev.sample\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">StdDev</span></code> renvoie la déviation standard de population. Cependant, si <code class=\"docutils literal notranslate\"><span class=\"pre\">sample=True</span></code>, la valeur renvoyée sera la déviation standard d’échantillon.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"sum\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code><a class=\"heading-anchor\" href=\"#sum\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Sum\">\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\">Sum</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Sum\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Calcule la somme de toutes les valeurs de l’expression donnée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__sum</span></code></p></li>\n<li><p>Type de la valeur renvoyée : identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Sum.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Sum.distinct\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code> renvoie la somme des valeurs uniques. Cela correspond au code SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">SUM(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>. La valeur par défaut est False`.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"variance\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Variance</span></code><a class=\"heading-anchor\" href=\"#variance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Variance\">\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\">Variance</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</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\">sample</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</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\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Variance\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la variance des données de l’expression donnée.</p>\n<ul class=\"simple\">\n<li><p>Alias par défaut : <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;champ&gt;__variance</span></code></p></li>\n<li><p>Type de la valeur renvoyée : <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> si la valeur d’entrée est <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>, sinon identique au champ de départ, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> s’il est indiqué</p></li>\n</ul>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Variance.sample\">\n<span class=\"sig-name descname\"><span class=\"pre\">sample</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Variance.sample\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">Variance</span></code> renvoie la variance de population. Cependant, si <code class=\"docutils literal notranslate\"><span class=\"pre\">sample=True</span></code>, la valeur renvoyée sera la variance d’échantillon.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"query-related-tools\">\n<h2>Outils liés aux requêtes<a class=\"heading-anchor\" href=\"#query-related-tools\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Cette section présente du contenu de référence pour des outils liés aux requêtes et non documentés ailleurs.</p>\n<section id=\"q-objects\">\n<h3>Objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Q()</span></code><a class=\"heading-anchor\" href=\"#q-objects\"><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.Q\">\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\">Q</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Q\"><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\">Q()</span></code> représente une condition SQL pouvant être utilisée dans les opérations liées aux bases de données. C’est le même principe que pour les objets <a class=\"reference internal\" href=\"/fr/3.2/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">F()</span></code></a> qui représentent la valeur d’un champ de modèle ou d’une annotation. Ils rendent possible la définition et la réutilisation de conditions ainsi que leur combinaison avec des opérateurs tels que <code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code>) et <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code>). Voir <a class=\"reference internal\" href=\"/fr/3.2/topics/db/queries/#complex-lookups-with-q\"><span class=\"std std-ref\">Requêtes complexes avec des objets Q</span></a>.</p>\n</section>\n<section id=\"prefetch-objects\">\n<h3>Objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch()</span></code><a class=\"heading-anchor\" href=\"#prefetch-objects\"><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.Prefetch\">\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\">Prefetch</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">queryset</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\">to_attr</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Prefetch\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>L’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch()</span></code> peut être utilisé pour contrôler le fonctionnement de <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup</span></code> décrit les relations à suivre et fonctionne de la même façon que les recherches basées sur des chaînes transmises à <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a>. Par exemple :</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\">Prefetch</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"go\"># This will only execute two queries regardless of the number of Question</span>\n<span class=\"go\"># and Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n</code></pre></div>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> fournit un jeu <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> de base pour la recherche concernée. C’est utile pour filtrer de manière plus précise l’opération de préchargement ou pour appeler <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> à partir de la relation préchargée, ce qui réduira encore plus le nombre de requêtes :</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\">voted_choices</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">votes__gt</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">voted_choices</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch</span> <span class=\"o\">=</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">voted_choices</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n</code></pre></div>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> attribue le résultat de l’opération de préchargement à un attribut personnalisé :</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\">prefetch</span> <span class=\"o\">=</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">voted_choices</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;voted_choices&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">voted_choices</span>\n<span class=\"go\">[&lt;Choice: The sky&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Quand <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> est utilisé, le résultat préchargé est stocké dans une liste. Cela peut apporter une amélioration de rapidité significative par rapport aux appels <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> traditionnels qui stockent les résultats en cache dans une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n</aside>\n</section>\n<section id=\"prefetch-related-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code><a class=\"heading-anchor\" href=\"#prefetch-related-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.prefetch_related_objects\">\n<span class=\"sig-name descname\"><span class=\"pre\">prefetch_related_objects</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_instances</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">related_lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.prefetch_related_objects\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Précharge les expression de requête données pour la liste d’instances de modèles. C’est utile dans du code qui reçoit une liste d’instances de modèles et non pas un <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>; par exemple, lors de la récupération de modèles depuis un cache ou lors d’une instanciation manuelle.</p>\n<p>Passez une liste d’instances de modèles (toutes de la même classe) et les requêtes ou objets <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code></a> que vous souhaitez précharger. Par exemple :</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\">prefetch_related_objects</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">fetch_top_restaurants_from_cache</span><span class=\"p\">()</span>  <span class=\"c1\"># A list of Restaurants</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related_objects</span><span class=\"p\">(</span><span class=\"n\">restaurants</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Lors de l’utilisation de plusieurs bases de données avec <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects</span></code>, la requête de préchargement utilisera la base de données associée à l’instance de modèle. Ce comportement peut être remplacé en utilisant un jeu de requête personnalisé dans l’expression de liaison.</p>\n</section>\n<section id=\"filteredrelation-objects\">\n<h3>Objets <code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation()</span></code><a class=\"heading-anchor\" href=\"#filteredrelation-objects\"><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.FilteredRelation\">\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\">FilteredRelation</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">relation_name</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <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\">Q()</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation.relation_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">relation_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.relation_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom du champ sur lequel portera le filtrage de la relation.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation.condition\">\n<span class=\"sig-name descname\"><span class=\"pre\">condition</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.condition\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un objet <a class=\"reference internal\" href=\"#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> pour contrôler le filtrage.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation</span></code> est utilisé avec <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> pour créer une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span></code> lorsque un <code class=\"docutils literal notranslate\"><span class=\"pre\">JOIN</span></code> est effectué. Il n’agit pas sur la relation par défaut mais sur le nom d’annotation (<code class=\"docutils literal notranslate\"><span class=\"pre\">pizzas_vegetarian</span></code> dans l’exemple ci-dessous).</p>\n<p>Par exemple, pour trouver tous les restaurants ayant des pizzas végétariennes avec <code class=\"docutils literal notranslate\"><span class=\"pre\">'mozarella'</span></code> dans le nom</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\">FilteredRelation</span><span class=\"p\">,</span> <span class=\"n\">Q</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</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\">pizzas_vegetarian</span><span class=\"o\">=</span><span class=\"n\">FilteredRelation</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>       <span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">pizzas__vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>   <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pizzas_vegetarian__name__icontains</span><span class=\"o\">=</span><span class=\"s1\">&#39;mozzarella&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>S’il y a beaucoup de pizzas, ce jeu de requête sera plus efficace que</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\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pizzas__vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pizzas__name__icontains</span><span class=\"o\">=</span><span class=\"s1\">&#39;mozzarella&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>car le filtrage dans la clause <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> du premier jeu de requête ne s’appliquera que sur les pizzas végétariennes.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation</span></code> ne prend pas en charge :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.only()</span></code></a> et <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a>.</p></li>\n<li><p>Une <a class=\"reference internal\" href=\"/fr/3.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a> héritée d’un modèle parent.</p></li>\n</ul>\n<aside class=\"version-note version-changed\" data-version=\"3.2\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>La prise en charge des relations imbriquées a été ajoutée.</p>\n</aside>\n</section>\n</section>","rootId":"queryset-api-reference","toc":[{"title":"Quand les objets QuerySet sont évalués","anchor":"when-querysets-are-evaluated","children":[{"title":"QuerySet et « pickling »","anchor":"pickling-querysets","children":[]}]},{"title":"API QuerySet","anchor":"queryset-api","children":[{"title":"Méthodes renvoyant de nouveaux QuerySet","anchor":"methods-that-return-new-querysets","children":[{"title":"filter()","anchor":"filter","children":[]},{"title":"exclude()","anchor":"exclude","children":[]},{"title":"annotate()","anchor":"annotate","children":[]},{"title":"alias()","anchor":"alias","children":[]},{"title":"order_by()","anchor":"order-by","children":[]},{"title":"reverse()","anchor":"reverse","children":[]},{"title":"distinct()","anchor":"distinct","children":[]},{"title":"values()","anchor":"values","children":[]},{"title":"values_list()","anchor":"values-list","children":[]},{"title":"dates()","anchor":"dates","children":[]},{"title":"datetimes()","anchor":"datetimes","children":[]},{"title":"none()","anchor":"none","children":[]},{"title":"all()","anchor":"all","children":[]},{"title":"union()","anchor":"union","children":[]},{"title":"intersection()","anchor":"intersection","children":[]},{"title":"difference()","anchor":"difference","children":[]},{"title":"select_related()","anchor":"select-related","children":[]},{"title":"prefetch_related()","anchor":"prefetch-related","children":[]},{"title":"extra()","anchor":"extra","children":[]},{"title":"defer()","anchor":"defer","children":[]},{"title":"only()","anchor":"only","children":[]},{"title":"using()","anchor":"using","children":[]},{"title":"select_for_update()","anchor":"select-for-update","children":[]},{"title":"raw()","anchor":"raw","children":[]}]},{"title":"Opérateurs renvoyant de nouveaux QuerySet","anchor":"operators-that-return-new-querysets","children":[{"title":"AND (&)","anchor":"and","children":[]},{"title":"OR (|)","anchor":"or","children":[]}]},{"title":"Méthodes qui ne renvoient pas de QuerySet","anchor":"methods-that-do-not-return-querysets","children":[{"title":"get()","anchor":"get","children":[]},{"title":"create()","anchor":"create","children":[]},{"title":"get_or_create()","anchor":"get-or-create","children":[]},{"title":"update_or_create()","anchor":"update-or-create","children":[]},{"title":"bulk_create()","anchor":"bulk-create","children":[]},{"title":"bulk_update()","anchor":"bulk-update","children":[]},{"title":"count()","anchor":"count","children":[]},{"title":"in_bulk()","anchor":"in-bulk","children":[]},{"title":"iterator()","anchor":"iterator","children":[{"title":"Avec des curseurs côté serveur","anchor":"with-server-side-cursors","children":[]},{"title":"Sans curseurs côté serveur","anchor":"without-server-side-cursors","children":[]}]},{"title":"latest()","anchor":"latest","children":[]},{"title":"earliest()","anchor":"earliest","children":[]},{"title":"first()","anchor":"first","children":[]},{"title":"last()","anchor":"last","children":[]},{"title":"aggregate()","anchor":"aggregate","children":[]},{"title":"exists()","anchor":"exists","children":[]},{"title":"update()","anchor":"update","children":[{"title":"Jeux de requête triés","anchor":"ordered-queryset","children":[]}]},{"title":"delete()","anchor":"delete","children":[]},{"title":"as_manager()","anchor":"as-manager","children":[]},{"title":"explain()","anchor":"explain","children":[]}]},{"title":"Recherches dans les champs","anchor":"field-lookups","children":[{"title":"exact","anchor":"exact","children":[]},{"title":"iexact","anchor":"iexact","children":[]},{"title":"contains","anchor":"contains","children":[]},{"title":"icontains","anchor":"icontains","children":[]},{"title":"in","anchor":"in","children":[]},{"title":"gt","anchor":"gt","children":[]},{"title":"gte","anchor":"gte","children":[]},{"title":"lt","anchor":"lt","children":[]},{"title":"lte","anchor":"lte","children":[]},{"title":"startswith","anchor":"startswith","children":[]},{"title":"istartswith","anchor":"istartswith","children":[]},{"title":"endswith","anchor":"endswith","children":[]},{"title":"iendswith","anchor":"iendswith","children":[]},{"title":"range","anchor":"range","children":[]},{"title":"date","anchor":"date","children":[]},{"title":"year","anchor":"year","children":[]},{"title":"iso_year","anchor":"iso-year","children":[]},{"title":"month","anchor":"month","children":[]},{"title":"day","anchor":"day","children":[]},{"title":"week","anchor":"week","children":[]},{"title":"week_day","anchor":"week-day","children":[]},{"title":"iso_week_day","anchor":"iso-week-day","children":[]},{"title":"quarter","anchor":"quarter","children":[]},{"title":"time","anchor":"time","children":[]},{"title":"hour","anchor":"hour","children":[]},{"title":"minute","anchor":"minute","children":[]},{"title":"second","anchor":"second","children":[]},{"title":"isnull","anchor":"isnull","children":[]},{"title":"regex","anchor":"regex","children":[]},{"title":"iregex","anchor":"iregex","children":[]}]},{"title":"Fonctions d’agrégation","anchor":"aggregation-functions","children":[{"title":"expressions","anchor":"expressions","children":[]},{"title":"output_field","anchor":"output-field","children":[]},{"title":"filter","anchor":"aggregate-filter","children":[]},{"title":"**extra","anchor":"id7","children":[]},{"title":"Avg","anchor":"avg","children":[]},{"title":"Count","anchor":"id8","children":[]},{"title":"Max","anchor":"max","children":[]},{"title":"Min","anchor":"min","children":[]},{"title":"StdDev","anchor":"stddev","children":[]},{"title":"Sum","anchor":"sum","children":[]},{"title":"Variance","anchor":"variance","children":[]}]}]},{"title":"Outils liés aux requêtes","anchor":"query-related-tools","children":[{"title":"Objets Q()","anchor":"q-objects","children":[]},{"title":"Objets Prefetch()","anchor":"prefetch-objects","children":[]},{"title":"prefetch_related_objects()","anchor":"prefetch-related-objects","children":[]},{"title":"Objets FilteredRelation()","anchor":"filteredrelation-objects","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.2/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/3.2/ref/models/"}],"prev":{"docname":"ref/models/instances","title":"Référence des instances de modèles","url":"/fr/3.2/ref/models/instances/"},"next":{"docname":"ref/models/lookups","title":"API de référence des expressions de recherche","url":"/fr/3.2/ref/models/lookups/"},"formats":{"html":"/fr/3.2/ref/models/querysets/","markdown":"/fr/3.2/ref/models/querysets.md","json":"/fr/3.2/ref/models/querysets.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/ref/models/querysets.txt","official":"https://docs.djangoproject.com/fr/3.2/ref/models/querysets/","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"]}