{"title":"Création de requêtes","version":"4.1","locale":"fr","docname":"topics/db/queries","url":"/fr/4.1/topics/db/queries/","canonical":"https://djangodocs.dev/fr/4.1/topics/db/queries/","summary":"Une fois les modèles de données créés, Django offre automatiquement une API d’abstraction de base de données qui permet de créer, obtenir, mettre à jour et…","html":"<h1>Création de requêtes<a class=\"heading-anchor\" href=\"#making-queries\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Une fois les <a class=\"reference internal\" href=\"/fr/4.1/topics/db/models/\"><span class=\"doc\">modèles de données</span></a> créés, Django offre automatiquement une API d’abstraction de base de données qui permet de créer, obtenir, mettre à jour et supprimer des objets. Ce document explique comment utiliser cette API. Consultez la <a class=\"reference internal\" href=\"/fr/4.1/ref/models/\"><span class=\"doc\">référence des modèles de données</span></a> pour des détails complets sur toutes les options d’interrogation des modèles.</p>\n<p>À travers ce guide (et dans la référence), nous nous référons aux modèles suivants, qui forment une application de blog :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Blog</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    tagline <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n\n    <span class=\"k\">def</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=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    email <span class=\"o\">=</span> models<span class=\"o\">.</span>EmailField<span class=\"p\">()</span>\n\n    <span class=\"k\">def</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=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Entry</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    blog <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Blog<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">)</span>\n    body_text <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    mod_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">(</span>default<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">)</span>\n    authors <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n    number_of_comments <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    number_of_pingbacks <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    rating <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</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=\"bp\">self</span><span class=\"o\">.</span>headline\n</code></pre></div>\n<section id=\"creating-objects\">\n<h2>Création d’objets<a class=\"heading-anchor\" href=\"#creating-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour représenter des données d’une table de base de données en objets Python, Django utilise un système intuitif : une classe de modèle représente une table de base de données, et une instance de cette classe représente un enregistrement particulier dans la table de base de données.</p>\n<p>Pour créer un objet, créez une instance de la classe de modèle en utilisant des paramètres nommés, puis appelez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> pour l’enregistrer dans la base de données.</p>\n<p>En supposant que les modèles se trouvent dans un fichier <code class=\"docutils literal notranslate\">mysite/blog/models.py</code>, voici un 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=\"nn\">blog.models</span> <span class=\"kn\">import</span> Blog\n<span class=\"gp\">&gt;&gt;&gt; </span>b <span class=\"o\">=</span> Blog<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Beatles Blog&#39;</span><span class=\"p\">,</span> tagline<span class=\"o\">=</span><span class=\"s1\">&#39;All the latest Beatles news.&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Ceci exécute une commande SQL <code class=\"docutils literal notranslate\">INSERT</code> en arrière-plan. Django ne sollicite pas la base de données tant que vous n’appelez pas explicitement <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>.</p>\n<p>La méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> ne renvoie aucune valeur.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p><a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> accepte un certain nombre d’options avancées décrites ailleurs. Consultez la documentation de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> pour les détails complets.</p>\n<p>Pour créer et enregistrer un objet en une seule étape, utilisez la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\">create()</code></a>.</p>\n</aside>\n</section>\n<section id=\"saving-changes-to-objects\">\n<h2>Enregistrement des modifications d’objets<a class=\"heading-anchor\" href=\"#saving-changes-to-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour enregistrer les modifications d’un objet existant dans la base de données, utilisez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>.</p>\n<p>Considérant une instance <code class=\"docutils literal notranslate\">b5</code> d’un <code class=\"docutils literal notranslate\">Blog</code> ayant déjà été enregistrée dans la base de données, cet exemple modifie son nom et met à jour son enregistrement dans 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=\"gp\">&gt;&gt;&gt; </span>b5<span class=\"o\">.</span>name <span class=\"o\">=</span> <span class=\"s1\">&#39;New name&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b5<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Ceci génère une commande SQL <code class=\"docutils literal notranslate\">UPDATE</code> en arrière-plan. Django ne sollicite pas la base de données tant que vous n’appelez pas explicitement <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>.</p>\n<section id=\"saving-foreignkey-and-manytomanyfield-fields\">\n<h3>Enregistrement des champs <code class=\"docutils literal notranslate\">ForeignKey</code> et <code class=\"docutils literal notranslate\">ManyToManyField</code><a class=\"heading-anchor\" href=\"#saving-foreignkey-and-manytomanyfield-fields\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La mise à jour d’un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> fonctionne exactement de la même façon que l’enregistrement d’un champ normal, attribuez un objet du bon type au champ en question. Cet exemple met à jour l’attribut <code class=\"docutils literal notranslate\">blog</code> d’une instance <code class=\"docutils literal notranslate\">Entry</code> nommée <code class=\"docutils literal notranslate\">entry</code>, en supposant que les instances appropriées de <code class=\"docutils literal notranslate\">Entry</code> et de <code class=\"docutils literal notranslate\">Blog</code> sont déjà enregistrées dans la base de données (afin de pouvoir être récupérées ci-dessous) :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">blog.models</span> <span class=\"kn\">import</span> Blog<span class=\"p\">,</span> Entry\n<span class=\"gp\">&gt;&gt;&gt; </span>entry <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>cheese_blog <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar Talk&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>entry<span class=\"o\">.</span>blog <span class=\"o\">=</span> cheese_blog\n<span class=\"gp\">&gt;&gt;&gt; </span>entry<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>La mise à jour d’un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> fonctionne un peu différemment ; utilisez la méthode <a class=\"reference internal\" href=\"/fr/4.1/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\">add()</code></a> du champ pour ajouter un enregistrement à la relation. Cet exemple ajoute l’instance <code class=\"docutils literal notranslate\">Author</code> <code class=\"docutils literal notranslate\">joe</code> à l’objet <code class=\"docutils literal notranslate\">entry</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=\"kn\">from</span> <span class=\"nn\">blog.models</span> <span class=\"kn\">import</span> Author\n<span class=\"gp\">&gt;&gt;&gt; </span>joe <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Joe&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>entry<span class=\"o\">.</span>authors<span class=\"o\">.</span>add<span class=\"p\">(</span>joe<span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour ajouter plusieurs enregistrements à un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> d’un seul coup, indiquez plusieurs paramètres dans l’appel à <a class=\"reference internal\" href=\"/fr/4.1/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\">add()</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=\"gp\">&gt;&gt;&gt; </span>john <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>paul <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Paul&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>george <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;George&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>ringo <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Ringo&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>entry<span class=\"o\">.</span>authors<span class=\"o\">.</span>add<span class=\"p\">(</span>john<span class=\"p\">,</span> paul<span class=\"p\">,</span> george<span class=\"p\">,</span> ringo<span class=\"p\">)</span>\n</code></pre></div>\n<p>Django se plaint si vous essayez d’assigner ou d’ajouter un objet de type inapproprié.</p>\n</section>\n</section>\n<section id=\"retrieving-objects\">\n<span id=\"id1\"></span><h2>Sélection d’objets<a class=\"heading-anchor\" href=\"#retrieving-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour extraire des objets de la base de données, construisez un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> via un <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> de la classe de votre modèle.</p>\n<p>Un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> représente une collection d’objets de la base de données. Il peut comporter zéro, un ou plusieurs <em>filtres</em>. Les filtres réduisent les résultats de requêtes en fonction des paramètres donnés. En termes SQL, un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> équivaut à une commande <code class=\"docutils literal notranslate\">SELECT</code> et un filtre correspond à une clause restrictive telle que <code class=\"docutils literal notranslate\">WHERE</code> ou <code class=\"docutils literal notranslate\">LIMIT</code>.</p>\n<p>On obtient un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> en utilisant le <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> du modèle. Chaque modèle a au moins un <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> ; il s’appelle <a class=\"reference internal\" href=\"/fr/4.1/ref/models/class/#django.db.models.Model.objects\" title=\"django.db.models.Model.objects\"><code class=\"xref py py-attr docutils literal notranslate\">objects</code></a> par défaut. On y accède directement via la classe du modèle, 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=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects\n<span class=\"go\">&lt;django.db.models.manager.Manager object at ...&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b <span class=\"o\">=</span> Blog<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Foo&#39;</span><span class=\"p\">,</span> tagline<span class=\"o\">=</span><span class=\"s1\">&#39;Bar&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>objects\n<span class=\"go\">Traceback:</span>\n<span class=\"go\">    ...</span>\n<span class=\"go\">AttributeError: &quot;Manager isn&#39;t accessible via Blog instances.&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Les <code class=\"docutils literal notranslate\">Managers</code> ne sont accessibles que par les classes de modèle et non par les instances de modèle, afin d’accentuer la séparation entre les opérations sur les « tables » et les opérations sur les « enregistrements ».</p>\n</aside>\n<p>Le <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> est la source principale des <code class=\"docutils literal notranslate\">QuerySets</code> d’un modèle. Par exemple, <code class=\"docutils literal notranslate\">Blog.objects.all()</code> renvoie un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> contenant tous les objets <code class=\"docutils literal notranslate\">Blog</code> de la base de données.</p>\n<section id=\"retrieving-all-objects\">\n<h3>Sélection de tous les objets<a class=\"heading-anchor\" href=\"#retrieving-all-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La façon la plus simple d’obtenir des objets d’une table est de tous les sélectionner. Pour ce faire, utilisez la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.all\" title=\"django.db.models.query.QuerySet.all\"><code class=\"xref py py-meth docutils literal notranslate\">all()</code></a> d’un <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</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>all_entries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n</code></pre></div>\n<p>La méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.all\" title=\"django.db.models.query.QuerySet.all\"><code class=\"xref py py-meth docutils literal notranslate\">all()</code></a> renvoie un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> de tous les objets dans la base de données.</p>\n</section>\n<section id=\"retrieving-specific-objects-with-filters\">\n<h3>Sélection d’objets spécifiques avec les filtres<a class=\"heading-anchor\" href=\"#retrieving-specific-objects-with-filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> renvoyé par <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.all\" title=\"django.db.models.query.QuerySet.all\"><code class=\"xref py py-meth docutils literal notranslate\">all()</code></a> contient tous les objets de la table de la base de données. Mais le plus souvent, seul un sous-ensemble de tous les objets devra être sélectionné.</p>\n<p>Pour créer un tel sous-ensemble, vous affinez le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> initial en\ny ajoutant des filtres de conditions. Les deux façons les plus utilisées pour affiner un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> sont :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">filter(**kwargs)</code></dt><dd><p>Renvoie un nouveau <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> contenant les objets qui répondent aux paramètres de recherche donnés.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">exclude(**kwargs)</code></dt><dd><p>Renvoie un nouveau <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> contenant les objets qui ne répondent <em>pas</em> aux paramètres de recherche donnés.</p>\n</dd>\n</dl>\n<p>Les paramètres de recherche (<code class=\"docutils literal notranslate\">**kwargs</code> dans les définitions de fonction ci-dessus) doivent être dans le format décrit dans <a class=\"reference internal\" href=\"#field-lookups\">Recherches dans les champs</a> ci-dessous.</p>\n<p>Par exemple, pour obtenir un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> des articles de blog de l’année 2006, utilisez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2006</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Avec la classe de gestionnaire par défaut, c’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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2006</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"chaining-filters\">\n<span id=\"id2\"></span><h4>Enchaînement des filtres<a class=\"heading-anchor\" href=\"#chaining-filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le résultat de l’affinage d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> est lui-même un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, il est donc possible d’enchaîner les filtrages successifs. 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>exclude<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pub_date__gte<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"o\">.</span>today<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pub_date__gte<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<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\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>À partir du <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> initial de toutes les lignes dans la base de données, le code ci-dessus ajoute un filtre, puis une exclusion, puis un autre filtre. Le résultat final est un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> contenant tous les enregistrements ayant un titre (<code class=\"docutils literal notranslate\">headline</code>) commençant par « What », ayant été publiés entre le 30 janvier 2005 et aujourd’hui.</p>\n</section>\n<section id=\"filtered-querysets-are-unique\">\n<span id=\"id3\"></span><h4>Les <code class=\"docutils literal notranslate\">QuerySet</code> filtrés sont uniques<a class=\"heading-anchor\" href=\"#filtered-querysets-are-unique\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>À chaque fois que vous affinez un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, vous obtenez un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> tout neuf qui n’est lié d’aucune manière au <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> précédent. Chaque affinage crée un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> séparé et distinct qui peut être stocké, utilisé et réutilisé.</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>q1 <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;What&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q2 <span class=\"o\">=</span> q1<span class=\"o\">.</span>exclude<span class=\"p\">(</span>pub_date__gte<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"o\">.</span>today<span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q3 <span class=\"o\">=</span> q1<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__gte<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"o\">.</span>today<span class=\"p\">())</span>\n</code></pre></div>\n<p>Ces trois <code class=\"docutils literal notranslate\">QuerySet</code> sont séparés. Le premier est un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> de base contenant tous les enregistrements qui contiennent un titre commençant par « What ». Le second est un sous-ensemble du premier, avec un critère supplémentaire qui exclut les enregistrements dont le champ <code class=\"docutils literal notranslate\">pub_date</code> est aujourd’hui ou dans le futur. Le troisième est un sous-ensemble du premier, avec un critère supplémentaire qui sélectionne uniquement les enregistrements dont le champ <code class=\"docutils literal notranslate\">pub_date</code> est aujourd’hui ou dans le futur. Le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> initial (<code class=\"docutils literal notranslate\">q1</code>) n’est pas affecté par le processus d’affinage.</p>\n</section>\n<section id=\"querysets-are-lazy\">\n<span id=\"id4\"></span><h4>Les objects <code class=\"docutils literal notranslate\">QuerySet</code> sont différés<a class=\"heading-anchor\" href=\"#querysets-are-lazy\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les <code class=\"docutils literal notranslate\">QuerySets</code> sont différés (« lazy ») ; la création d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> ne génère aucune activité au niveau de la base de données. Vous pouvez empiler les filtres toute la journée, Django ne lance aucune requête tant\nque le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> n’est pas <em>évalué</em>. Regardez cet 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>q <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;What&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> q<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__lte<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"o\">.</span>today<span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> q<span class=\"o\">.</span>exclude<span class=\"p\">(</span>body_text__icontains<span class=\"o\">=</span><span class=\"s2\">&quot;food&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>q<span class=\"p\">)</span>\n</code></pre></div>\n<p>Malgré le fait que ceci ressemble à trois interrogations de la base de données, en réalité une seule interrogation est faite, à la dernière ligne (<code class=\"docutils literal notranslate\">print(q)</code>). En général, les résultats d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> ne sont récupérés de la base de données que lorsque vous les « demandez ». Lorsque cela arrive, le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> est <em>évalué</em> en accédant à la base de données. Pour plus de détails sur le moment exact où l’évaluation a lieu, consultez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#when-querysets-are-evaluated\"><span class=\"std std-ref\">Quand les objets QuerySet sont évalués</span></a>.</p>\n</section>\n</section>\n<section id=\"retrieving-a-single-object-with-get\">\n<span id=\"retrieving-single-object-with-get\"></span><h3>Sélection d’un objet unique avec <code class=\"docutils literal notranslate\">get()</code><a class=\"heading-anchor\" href=\"#retrieving-a-single-object-with-get\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> renvoie toujours un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, même si la requête ne renvoie qu’un seul objet ; dans ce cas, le <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> ne contiendra simplement qu’un seul élément.</p>\n<p>Si vous savez qu’un seul objet correspondra à votre requête, vous pouvez utiliser la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> d’un <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> qui renvoie directement l’objet :</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>one_entry <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>N’importe quelle expression de recherche peut être utilisée avec <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a>, comme pour <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>. Voir  <a class=\"reference internal\" href=\"#field-lookups\">Recherches dans les champs</a> ci-dessous.</p>\n<p>Notez qu’il y a une différence entre l’utilisation de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> et celle de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> avec le segment <code class=\"docutils literal notranslate\">[0]</code>. Si aucun résultat ne correspond à la requête, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> génère une exception <code class=\"docutils literal notranslate\">DoesNotExist</code>. Cette exception est un attribut de la classe de modèle sur laquelle la requête est appliquée ; ainsi, dans le code ci-dessus, s’il n’existe pas d’objet <code class=\"docutils literal notranslate\">Entry</code> avec une clé primaire de 1, Django génère l’exception <code class=\"docutils literal notranslate\">Entry.DoesNotExist</code>.</p>\n<p>De même, Django réagit si plus d’un élément correspond à la requête <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a>. Dans ce cas, il lève l’exception <a class=\"reference internal\" href=\"/fr/4.1/ref/exceptions/#django.core.exceptions.MultipleObjectsReturned\" title=\"django.core.exceptions.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\">MultipleObjectsReturned</code></a> qui est également un attribut de la classe de modèle elle-même.</p>\n</section>\n<section id=\"other-queryset-methods\">\n<h3>Autres méthodes de <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#other-queryset-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La plupart du temps, vous utiliserez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.all\" title=\"django.db.models.query.QuerySet.all\"><code class=\"xref py py-meth docutils literal notranslate\">all()</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> lorsque vous aurez besoin de sélectionner des objets dans la base de données. Cependant, c’est loin d’être tout ; consultez la <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#queryset-api\"><span class=\"std std-ref\">référence de l’API QuerySet</span></a> pour une liste complète des diverses méthodes de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>.</p>\n</section>\n<section id=\"limiting-querysets\">\n<span id=\"id5\"></span><h3>Limitation des <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#limiting-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Utilisez un sous-ensemble de la syntaxe Python de segmentation des listes pour restreindre un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> à un certain nombre de résultats. C’est l’équivalent des clauses SQL <code class=\"docutils literal notranslate\">LIMIT</code> et <code class=\"docutils literal notranslate\">OFFSET</code>.</p>\n<p>Par exemple, ceci renvoie les 5 premiers objets (<code class=\"docutils literal notranslate\">LIMIT 5</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Ceci renvoie du sixième au dixième objet  (<code class=\"docutils literal notranslate\">OFFSET 5 LIMIT 5</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[</span><span class=\"mi\">5</span><span class=\"p\">:</span><span class=\"mi\">10</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Les index négatifs (ex. : <code class=\"docutils literal notranslate\">Entry.objects.all()[-1]</code>) ne sont pas pris en charge.</p>\n<p>De manière générale, la segmentation d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> renvoie un nouveau <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> ; la requête n’est pas évaluée, sauf si vous utilisez le paramètre <code class=\"docutils literal notranslate\">step</code> de la syntaxe de segmentation de Python. Par exemple, ceci exécuterait effectivement la requête pour renvoyer une liste d’un objet sur 2 parmi les 10 premiers :</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[:</span><span class=\"mi\">10</span><span class=\"p\">:</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Tout filtre ou tri subséquent d’un jeu de requête segmenté est interdit en raison de la nature ambiguë de son éventuel fonctionnement.</p>\n<p>Pour obtenir un <em>seul</em> objet plutôt qu’une liste (ex. : <code class=\"docutils literal notranslate\">SELECT foo FROM bar LIMIT 1</code>), utilisez un index au lieu d’un segment. Par exemple, ceci renvoie le premier objet <code class=\"docutils literal notranslate\">Entry</code> de la base de données, après avoir trié les objets alphabétiquement par titre (<code class=\"docutils literal notranslate\">headline</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>C’est grossièrement é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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span>get<span class=\"p\">()</span>\n</code></pre></div>\n<p>Notez toutefois que si aucun objet ne correspond à la requête, une exception <code class=\"docutils literal notranslate\">IndexError</code> est générée dans le premier cas, tandis que dans le second cas, c’est l’exception <code class=\"docutils literal notranslate\">DoesNotExist</code> qui sera générée. Voir <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> pour plus de détails.</p>\n</section>\n<section id=\"field-lookups\">\n<span id=\"field-lookups-intro\"></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\">WHERE</code>. La syntaxe s’exprime par des paramètres nommés dans les méthodes <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>.</p>\n<p>Les paramètres nommés de base de ces requêtes prennent la forme <code class=\"docutils literal notranslate\">champ__typerequete=valeur</code> (il s’agit d’un double soulignement). 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__lte<span class=\"o\">=</span><span class=\"s1\">&#39;2006-01-01&#39;</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=\"o\">*</span> <span class=\"k\">FROM</span> blog_entry <span class=\"k\">WHERE</span> pub_date <span class=\"o\">&lt;=</span> <span class=\"s1\">&#39;2006-01-01&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-how-this-is-possible admonition\" role=\"note\">\n<p class=\"admonition-title\">Comment est-ce possible ?</p>\n<p>Python permet de définir des fonctions acceptant des paramètres nom-valeur arbitraires dont les noms et les valeurs sont évalués au moment de l’exécution. Pour plus d’informations, consultez <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/controlflow.html#tut-keywordargs\" title=\"(disponible dans Python v3.14)\"><span>Keyword Arguments</span></a> dans le tutoriel Python officiel.</p>\n</aside>\n<p>Le champ indiqué dans une recherche doit correspondre au nom d’un champ de modèle. Il existe cependant une exception ; dans le cas d’une clé étrangère <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, vous pouvez indiquer le nom du champ additionné du suffixe <code class=\"docutils literal notranslate\">_id</code>. Dans ce cas, le paramètre valeur doit contenir la valeur brute de la clé primaire du modèle étranger. 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog_id<span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous fournissez un paramètre nommé non valide, une fonction de recherche signalera une exception <code class=\"docutils literal notranslate\">TypeError</code>.</p>\n<p>L’API de base de données gère une vingtaine de types de recherche ; une référence complète se trouve dans la <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">référence des recherches de champs</span></a>. Pour vous donner une idée de ce qui est possible, voici quelques recherches parmi les plus fréquemment utilisées :</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact</code></a></dt><dd><p>Une correspondance « exacte ». 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>headline__exact<span class=\"o\">=</span><span class=\"s2\">&quot;Cat bites dog&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Produit le code SQL ressemblant à :</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"o\">=</span> <span class=\"s1\">&#39;Cat bites dog&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Si vous n’indiquez pas de type de recherche, c’est-à-dire si votre paramètre nommé ne contient pas de double soulignement, Django considère que le type de recherche est <code class=\"docutils literal notranslate\">exact</code>.</p>\n<p>Par exemple, les deux lignes 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=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>id__exact<span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>  <span class=\"c1\"># Explicit form</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>         <span class=\"c1\"># __exact is implied</span>\n</code></pre></div>\n<p>Il s’agit d’un raccourci commode, puisque les recherches <code class=\"docutils literal notranslate\">exact</code> sont les cas les plus courants.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact</code></a></dt><dd><p>Une recherche insensible à la casse. Ainsi, la 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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name__iexact<span class=\"o\">=</span><span class=\"s2\">&quot;beatles blog&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Aurait pour occurrence un <code class=\"docutils literal notranslate\">Blog</code> intitulé <code class=\"docutils literal notranslate\">&quot;Beatles Blog&quot;</code>, <code class=\"docutils literal notranslate\">&quot;beatles blog&quot;</code> ou même <code class=\"docutils literal notranslate\">&quot;BeAtlES blOG&quot;</code>.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a></dt><dd><p>Test d’inclusion sensible à la casse. 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pourrait être traduit grosso modo par ce code 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=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">LIKE</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\">headline</code>) <code class=\"docutils literal notranslate\">'Today Lennon honored'</code> correspondrait à cette recherche, mais pas <code class=\"docutils literal notranslate\">'today lennon honored'</code>.</p>\n<p>Il existe aussi une version insensible à la casse, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-icontains\"><code class=\"xref std std-lookup docutils literal notranslate\">icontains</code></a>.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-startswith\"><code class=\"xref std std-lookup docutils literal notranslate\">startswith</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-endswith\"><code class=\"xref std std-lookup docutils literal notranslate\">endswith</code></a></dt><dd><p>Recherche « commençant par » et « finissant par », respectivement. Il en existe aussi des versions insensibles à la casse : <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-istartswith\"><code class=\"xref std std-lookup docutils literal notranslate\">istartswith</code></a> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-iendswith\"><code class=\"xref std std-lookup docutils literal notranslate\">iendswith</code></a>.</p>\n</dd>\n</dl>\n<p>Encore une fois, ce n’est qu’un survol. Une référence complète est disponible dans la <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">référence des recherches de champ</span></a>.</p>\n</section>\n<section id=\"lookups-that-span-relationships\">\n<span id=\"id6\"></span><h3>Recherches traversant les relations<a class=\"heading-anchor\" href=\"#lookups-that-span-relationships\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django offre une approche puissante et intuitive pour « suivre » les relations dans les recherches, se chargeant automatiquement des <code class=\"docutils literal notranslate\">JOIN</code> SQL en arrière-plan. Pour atteindre une relation, utilisez les noms de champ qui servent de relation vers d’autres modèles, séparés par des doubles soulignements, jusqu’à atteindre le champ souhaité.</p>\n<p>Cet exemple sélectionne tous les objets <code class=\"docutils literal notranslate\">Entry</code> d’un <code class=\"docutils literal notranslate\">Blog</code> ayant pour <code class=\"docutils literal notranslate\">name</code> la valeur <code class=\"docutils literal notranslate\">'Beatles Blog'</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__name<span class=\"o\">=</span><span class=\"s1\">&#39;Beatles Blog&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce mécanisme de traversée de relations peut être aussi profond que vous le souhaitez.</p>\n<p>Ceci fonctionne également dans le sens inverse. Même s’il <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey.related_query_name\" title=\"django.db.models.ForeignKey.related_query_name\"><code class=\"xref py py-attr docutils literal notranslate\">peut être personnalisé</code></a>, la manière par défaut de se référer à une relation « inverse » dans une expression de requête est d’utiliser le nom du modèle en minuscules.</p>\n<p>Cet exemple sélectionne tous les objets <code class=\"docutils literal notranslate\">Blog</code> ayant au moins une <code class=\"docutils literal notranslate\">Entry</code> ayant un <code class=\"docutils literal notranslate\">headline</code> contenant <code class=\"docutils literal notranslate\">'Lennon'</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous filtrez à travers plusieurs relations et qu’un des modèles intermédiaires n’a pas de valeur répondant à la condition du filtre, Django le traite comme s’il y avait là un objet vide (toutes les valeurs sont <code class=\"docutils literal notranslate\">NULL</code>), mais valide. C’est-à-dire qu’aucune erreur ne sera signalée. Par exemple, dans ce filtre :</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__authors__name<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(partant du principe qu’il existe un modèle <code class=\"docutils literal notranslate\">Author</code> lié), s’il n’y a pas de <code class=\"docutils literal notranslate\">author</code> associé à une <code class=\"docutils literal notranslate\">entry</code>, ce sera traité comme s’il n’y avait pas non plus de <code class=\"docutils literal notranslate\">name</code>, plutôt que de signaler une erreur à cause de l”<code class=\"docutils literal notranslate\">author</code> manquant. Normalement, c’est bien le comportement souhaité. Le seul cas où ça pourrait porter à confusion, c’est quand vous utilisez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\">isnull</code></a>. 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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__authors__name__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>renvoie les objets <code class=\"docutils literal notranslate\">Blog</code> ayant un <code class=\"docutils literal notranslate\">author</code> avec le <code class=\"docutils literal notranslate\">name</code> vide ainsi que tous ceux ayant un <code class=\"docutils literal notranslate\">author</code> vide dans l”<code class=\"docutils literal notranslate\">entry</code>. Si vous ne voulez pas de cette deuxième catégorie d’objets, vous pourriez écrire :</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__authors__isnull<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> entry__authors__name__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"spanning-multi-valued-relationships\">\n<span id=\"id7\"></span><h4>Traversée des relations multivaluées<a class=\"heading-anchor\" href=\"#spanning-multi-valued-relationships\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Lors de la traversée d’un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> ou d’un clé <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> inverse (comme de <code class=\"docutils literal notranslate\">Blog</code> à <code class=\"docutils literal notranslate\">Entry</code>), le filtrage sur plusieurs attributs pose la question de savoir si chaque attribut doit correspondre pour chaque objet lié. On pourrait rechercher des blogs qui ont un article en 2008 avec <em>« “Lennon” »</em> dans son titre, ou plus simplement des blogs qui ont un article en 2008 de même que des articles plus vieux ou plus récentes qui contiennent <em>« “Lennon” »</em> dans leur titre.</p>\n<p>Pour sélectionner tous les blogs contenant au moins un article en 2008 ayant <em>« Lennon »</em> dans son titre (le même article devant satisfaire les deux conditions), il faudrait écrire</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span> entry__pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Sinon, pour effectuer une requête plus permissive sélectionnant tous les blogs ayant un ou plusieurs articles avec <em>« Lennon »</em> dans leur titre et un ou plusieurs articles en 2008, on écrirait</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>entry__pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Supposons qu’il n’y ait qu’un seul blog ayant à la fois des articles contenant <em>« Lennon »</em> et des articles de 2008, mais qu’aucun des articles de 2008 ne contienne <em>« Lennon »</em>. La première requête ne renverrait aucun blog, mais la seconde renverrait ce blog (et cela parce que les lignes sélectionnées par le second filtre ne sont pas forcément les mêmes que celles du premier filtre ; chaque instruction de filtrage agit sur les éléments <code class=\"docutils literal notranslate\">Blog</code>, pas sur les éléments <code class=\"docutils literal notranslate\">Entry</code> ). En résumé, si toutes les conditions doivent s’appliquer sur les mêmes objets liés, alors chaque filtre doit être contenu dans un même appel à <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Comme la seconde requête (plus permissive) enchaîne plusieurs filtres, elle effectue plusieurs jointures vers le modèle principal, ce qui peut provoquer des doublons.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n<span class=\"gp\">&gt;&gt;&gt; </span>beatles <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Beatles Blog&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pop <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Pop Music Blog&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    blog<span class=\"o\">=</span>beatles<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;New Lennon Biography&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Entry: New Lennon Biography&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    blog<span class=\"o\">=</span>beatles<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;New Lennon Biography in Paperback&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2009</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Entry: New Lennon Biography in Paperback&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    blog<span class=\"o\">=</span>pop<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;Best Albums of 2008&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">15</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Entry: Best Albums of 2008&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    blog<span class=\"o\">=</span>pop<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon Would Have Loved Hip Hop&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2020</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Entry: Lennon Would Have Loved Hip Hop&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    entry__pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Blog: Beatles Blog&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    entry__pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Blog: Beatles Blog&gt;, &lt;Blog: Beatles Blog&gt;, &lt;Blog: Pop Music Blog]&gt;</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le comportement de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> pour les requêtes qui couvrent des relations multi-valeurs” tel que décrit ci-dessus, n’est pas implémenté de la même manière pour <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a>. Au contraire, les conditions de restriction indiquées lors qu’un appel à  <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> ne doivent pas nécessairement s’appliquer au même élément.</p>\n<p>Par exemple, la requête ci-dessous exclurait les blogues qui contiennent <strong>à la fois</strong> <em>« Lennon »</em> dans le titre <em>et</em> des entrées publiées en 2008</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>exclude<span class=\"p\">(</span>\n    entry__headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n    entry__pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Cependant, contrairement au comportement lors de l’utilisation de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, cela ne sélectionnera pas les blogs basés sur des entrées qui satisfont les deux conditions en même temps. Pour faire cela, c’est à dire pour sélectionner tous les blogs qui ne contiennent pas d’entrées publiées avec <em>« Lennon »</em> et qui ont été publiées en 2008, vous devez faire deux 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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>exclude<span class=\"p\">(</span>\n    entry__in<span class=\"o\">=</span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n        headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">,</span>\n        pub_date__year<span class=\"o\">=</span><span class=\"mi\">2008</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"filters-can-reference-fields-on-the-model\">\n<span id=\"using-f-expressions-in-filters\"></span><h3>Les filtres peuvent référencer les champs d’un modèle<a class=\"heading-anchor\" href=\"#filters-can-reference-fields-on-the-model\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dans les exemples donnés jusqu’ici, nous avons construit des filtres comparant la valeur d’un champ de modèle avec une constante. Mais qu’en est-il si vous souhaitez comparer la valeur d’un champ de modèle avec un autre champ du même modèle ?</p>\n<p>Django propose les <a class=\"reference internal\" href=\"/fr/4.1/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\">expressions F</code></a> pour autoriser de telles comparaisons. Les instances de <code class=\"docutils literal notranslate\">F()</code> agissent comme des références vers un champ de modèle à l’intérieur d’une requête. Ces références peuvent ensuite être utilisées dans des filtres de requêtes pour comparer les valeurs de deux champs différents d’une même instance de modèle.</p>\n<p>Par exemple, pour obtenir la liste de tous les articles de blogue ayant reçus plus de commentaires que de « pings », nous construisons un objet <code class=\"docutils literal notranslate\">F()</code> pour référencer le nombre de pings afin d’utiliser cet objet <code class=\"docutils literal notranslate\">F()</code> dans la 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=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>number_of_comments__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_pingbacks&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Django prend en charge l’utilisation des opérateurs arithmétiques addition, soustraction, multiplication, division, modulo et puissance avec les objets <code class=\"docutils literal notranslate\">F()</code>, aussi bien avec des constantes qu’avec d’autres objets <code class=\"docutils literal notranslate\">F()</code>. Pour obtenir tous les articles de blogue avec <em>plus de deux fois</em> de commentaires que de pings, nous modifions ainsi la 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>number_of_comments__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_pingbacks&#39;</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour trouver tous les articles où la notation de l’article est plus petite que la somme des pings et des commentaires, nous pourrions effectuer cette 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>rating__lt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_comments&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_pingbacks&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Vous pouvez aussi employer la notation en double soulignement pour traverser les relations dans un objet <code class=\"docutils literal notranslate\">F()</code>. Un objet <code class=\"docutils literal notranslate\">F()</code> contenant un double soulignement produira toute jointure nécessaire pour accéder aux objets liés. Par exemple, pour obtenir tous les articles dont le nom de l’auteur est égal au nom du blogue, nous pourrions effectuer la 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>authors__name<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Pour les champs date et date/heure, il est possible d’ajouter ou de soustraire un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">timedelta</code></a>. L’exemple suivant renvoie tous les articles modifiés plus de 3 jours après avoir été publié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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> timedelta\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>mod_date__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Les objets <code class=\"docutils literal notranslate\">F()</code> prennent en charge les opérations bit à bit via <code class=\"docutils literal notranslate\">.bitand()</code>, <code class=\"docutils literal notranslate\">.bitor()</code>, <code class=\"docutils literal notranslate\">.bitxor()</code>,  <code class=\"docutils literal notranslate\">.bitrightshift()</code> et <code class=\"docutils literal notranslate\">.bitleftshift()</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>F<span class=\"p\">(</span><span class=\"s1\">&#39;somefield&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>bitand<span class=\"p\">(</span><span class=\"mi\">16</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-oracle admonition\" role=\"note\">\n<p class=\"admonition-title\">Oracle</p>\n<p>Oracle ne prend pas en charge l’opération bit à bit XOR.</p>\n</aside>\n</section>\n<section id=\"expressions-can-reference-transforms\">\n<span id=\"using-transforms-in-expressions\"></span><h3>Les expressions peuvent référencer des transformations<a class=\"heading-anchor\" href=\"#expressions-can-reference-transforms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django prend en charge l’appel à des transformations dans les expressions.</p>\n<p>Par exemple, pour trouver tous les objets <code class=\"docutils literal notranslate\">Entry</code> publiés la même année que leur date de dernière modification</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;mod_date__year&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Pour trouver l’année de publication la plus ancienne d’un élément, on peut lancer la 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=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Min\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>first_published_year<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s1\">&#39;pub_date__year&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Cette exemple cherche la valeur de l’élément le mieux noté et le nombre total de commentaires de tous les éléments pour chaque année</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> OuterRef<span class=\"p\">,</span> Subquery<span class=\"p\">,</span> Sum\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s1\">&#39;pub_date__year&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    top_rating<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>            pub_date__year<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s1\">&#39;pub_date__year&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s1\">&#39;-rating&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s1\">&#39;rating&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    total_comments<span class=\"o\">=</span>Sum<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_comments&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"the-pk-lookup-shortcut\">\n<h3>Le raccourci de recherche <code class=\"docutils literal notranslate\">pk</code><a class=\"heading-anchor\" href=\"#the-pk-lookup-shortcut\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pour des raisons pratiques, Django fournit un raccourci de recherche <code class=\"docutils literal notranslate\">pk</code>, signifiant « primary key » (clé primaire).</p>\n<p>Dans le modèle d’exemple <code class=\"docutils literal notranslate\">Blog</code>, la clé primaire est le champ <code class=\"docutils literal notranslate\">id</code>. Ainsi, ces trois lignes 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=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>id__exact<span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span> <span class=\"c1\"># Explicit form</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span> <span class=\"c1\"># __exact is implied</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span> <span class=\"c1\"># pk implies id__exact</span>\n</code></pre></div>\n<p>L’emploi de <code class=\"docutils literal notranslate\">pk</code> n’est pas limité aux requêtes <code class=\"docutils literal notranslate\">__exact</code>; toute expression de requête peut être combinée avec <code class=\"docutils literal notranslate\">pk</code> pour effectuer une requête sur la clé primaire d’un modèle :</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\"># Get blogs entries with id 1, 4 and 7</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk__in<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">4</span><span class=\"p\">,</span><span class=\"mi\">7</span><span class=\"p\">])</span>\n\n<span class=\"c1\"># Get all blog entries with id &gt; 14</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk__gt<span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les recherches sur <code class=\"docutils literal notranslate\">pk</code> fonctionnent également en traversant les relations. Par exemple, ces trois lignes 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=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__id__exact<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"c1\"># Explicit form</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__id<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>        <span class=\"c1\"># __exact is implied</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__pk<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>        <span class=\"c1\"># __pk implies __id__exact</span>\n</code></pre></div>\n</section>\n<section id=\"escaping-percent-signs-and-underscores-in-like-statements\">\n<h3>Échappement des signes pour cent et des soulignements dans les instructions <code class=\"docutils literal notranslate\">LIKE</code><a class=\"heading-anchor\" href=\"#escaping-percent-signs-and-underscores-in-like-statements\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les recherches de champs produisant des instructions SQL <code class=\"docutils literal notranslate\">LIKE</code> (<code class=\"docutils literal notranslate\">iexact</code>, <code class=\"docutils literal notranslate\">contains</code>, <code class=\"docutils literal notranslate\">icontains</code>, <code class=\"docutils literal notranslate\">startswith</code>, <code class=\"docutils literal notranslate\">istartswith</code>, <code class=\"docutils literal notranslate\">endswith</code> et <code class=\"docutils literal notranslate\">iendswith</code>) échappent automatiquement les deux caractères à signification spéciale des instructions <code class=\"docutils literal notranslate\">LIKE</code>: le signe pour cent et le soulignement (dans une instruction <code class=\"docutils literal notranslate\">LIKE</code>, le signe pour cent est utilisé comme caractère de remplacement multiple alors qu’un soulignement est utilisé comme caractère de remplacement unique).</p>\n<p>Cela signifie que les choses devraient fonctionner intuitivement, sans faille d’abstraction. Par exemple, pour obtenir la liste de tous les articles contenant un signe pour cent, indiquez le signe pour cent comme pour n’importe quel autre caractère :</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;%&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Django se charge de l’échappement à votre place ; le code SQL résultant ressemblera à quelque chose 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=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;%\\%%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Même chose pour les soulignements. Aussi bien les signes pour cent que les soulignements sont gérés pour vous de manière transparente.</p>\n</section>\n<section id=\"caching-and-querysets\">\n<span id=\"id8\"></span><h3>Mise en cache et objets <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#caching-and-querysets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Chaque <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> contient un cache pour minimiser l’accès à la base de données. La compréhension de son fonctionnement vous permet d’écrire le code le plus efficace possible.</p>\n<p>Pour un nouvel objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, son cache est vide. À la première évaluation d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> (et donc qu’une requête de base de données est effectuée), Django enregistre les résultats de la requête dans le cache de l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> et renvoie les résultats qui ont été explicitement demandés (par ex. l’élément suivant dans le cas d’une itération du <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>). Les évaluations suivantes de l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> réutilisent les résultats mis en cache.</p>\n<p>Gardez à l’esprit ce comportement de mise en cache, car vous pourriez vous faire avoir si vous n’utilisez pas correctement l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>. Par exemple, le code suivant crée deux objets <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, les évalue et les abandonne :</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>e<span class=\"o\">.</span>headline <span class=\"k\">for</span> e <span class=\"ow\">in</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">([</span>e<span class=\"o\">.</span>pub_date <span class=\"k\">for</span> e <span class=\"ow\">in</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()])</span>\n</code></pre></div>\n<p>Dans ce cas, la même requête de base de données est exécutée deux fois, ce qui double en pratique la charge sur la base de données. Il est également imaginable que les deux listes ne contiennent pas exactement les mêmes enregistrements de base de données, car un objet <code class=\"docutils literal notranslate\">Entry</code> pourrait avoir été ajouté ou supprimé dans la fraction de seconde entre les deux requêtes.</p>\n<p>Pour éviter ce problème, stockez l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> et réutilisez-le :</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>queryset <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">([</span>p<span class=\"o\">.</span>headline <span class=\"k\">for</span> p <span class=\"ow\">in</span> queryset<span class=\"p\">])</span> <span class=\"c1\"># Evaluate the query set.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">([</span>p<span class=\"o\">.</span>pub_date <span class=\"k\">for</span> p <span class=\"ow\">in</span> queryset<span class=\"p\">])</span> <span class=\"c1\"># Reuse the cache from the evaluation.</span>\n</code></pre></div>\n<section id=\"when-querysets-are-not-cached\">\n<h4>Quand les objets <code class=\"docutils literal notranslate\">QuerySet</code> ne sont pas mis en cache<a class=\"heading-anchor\" href=\"#when-querysets-are-not-cached\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les objets <code class=\"docutils literal notranslate\">QuerySet</code> ne mettent pas toujours leurs résultats en cache. Lorsque seule une <em>partie</em> d’un queryset est évaluée, le cache est consulté mais s’il n’est pas rempli, les éléments renvoyés par la requête suivante ne sont pas mis en cache. Spécifiquement, cela signifie que la <a class=\"reference internal\" href=\"#limiting-querysets\"><span class=\"std std-ref\">restriction d’un jeu de requêtes</span></a> en employant une segmentation ou un index de liste ne remplira par le cache.</p>\n<p>Par exemple, l’interrogation répétée d’un objet <code class=\"docutils literal notranslate\">QuerySet</code> à l’aide d’un index effectue une requête dans la base de données à chaque fois :</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>queryset <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>queryset<span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">])</span> <span class=\"c1\"># Queries the database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>queryset<span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">])</span> <span class=\"c1\"># Queries the database again</span>\n</code></pre></div>\n<p>Cependant, si le jeu de requête complet a déjà été évalué, le cache sera tout de même mis à contribution :</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>queryset <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span>entry <span class=\"k\">for</span> entry <span class=\"ow\">in</span> queryset<span class=\"p\">]</span> <span class=\"c1\"># Queries the database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>queryset<span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">])</span> <span class=\"c1\"># Uses cache</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>queryset<span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">])</span> <span class=\"c1\"># Uses cache</span>\n</code></pre></div>\n<p>Voici quelques exemples d’autres actions qui déclenchent l’évaluation de tout l’objet <code class=\"docutils literal notranslate\">QuerySet</code> et qui par conséquent remplissent le cache :</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=\"p\">[</span>entry <span class=\"k\">for</span> entry <span class=\"ow\">in</span> queryset<span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">bool</span><span class=\"p\">(</span>queryset<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>entry <span class=\"ow\">in</span> queryset\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span>queryset<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’affichage simple d’un <code class=\"docutils literal notranslate\">QuerySet</code> ne remplit pas le cache. Ceci parce que l’appel à <code class=\"docutils literal notranslate\">__repr__()</code> ne renvoie qu’un segment du jeu de requête complet.</p>\n</aside>\n</section>\n</section>\n</section>\n<section id=\"asynchronous-queries\">\n<span id=\"async-queries\"></span><h2>Requêtes asynchrones<a class=\"heading-anchor\" href=\"#asynchronous-queries\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>Si vous écrivez des vues ou du code asynchrone, vous ne pouvez pas utiliser l’ORM pour des requêtes de la façon qui est décrite ci-dessus, car il n’est pas possible d’appeler du code synchrone <em>bloquant</em> à partir de code asynchrone, cela bloquerait la boucle événementielle (ou plus probablement Django le remarquera et générera l’exception <code class=\"docutils literal notranslate\">SynchronousOnlyOperation</code> pour que ce blocage ne se produise pas).</p>\n<p>Heureusement, il est possible de faire de nombreuses requêtes en utilisant les API de requêtes asynchrones de Django. Toute méthode susceptible de bloquer, telle que <code class=\"docutils literal notranslate\">get()</code> ou <code class=\"docutils literal notranslate\">delete()</code>, possède une variante asynchrone (<code class=\"docutils literal notranslate\">aget()</code> ou <code class=\"docutils literal notranslate\">adelete()</code>), et quand vous passez en boucle sur les résultats, vous pouvez alors utiliser l’itération asynchrone (<code class=\"docutils literal notranslate\">async for</code>).</p>\n<section id=\"query-iteration\">\n<h3>Requêtes et itération<a class=\"heading-anchor\" href=\"#query-iteration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>La manière par défaut de passer en boucle sur une requête - avec <code class=\"docutils literal notranslate\">for</code> - aboutit à une requête de base de données bloquante en arrière-plan du moment que Django charge les résultats au moment de l’itération. Pour corriger cela, vous pouvez exploiter <code class=\"docutils literal notranslate\">async for</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=\"k\">async</span> <span class=\"k\">for</span> entry <span class=\"ow\">in</span> Authors<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Soyez bien conscient que vous ne pouvez pas non plus exécuter d’autres opérations qui aboutiraient à une itération du jeu de requête, comme par exemple le placer dans un appel à <code class=\"docutils literal notranslate\">list()</code> pour forcer son évaluation (vous pouvez cependant utiliser <code class=\"docutils literal notranslate\">async for</code> dans une compréhension de liste si vous le souhaitez).</p>\n<p>Comme les méthodes de <code class=\"docutils literal notranslate\">QuerySet</code> telles que``filter()`` ou <code class=\"docutils literal notranslate\">exclude()</code> n’exécutent pas réellement de requête (elles préparent le jeu de requête à s’exécuter au moment de l’itération), vous pouvez les utiliser sans crainte dans du code asynchrone. Pour savoir quelles méthodes peuvent continuer à être utilisées telles quelles, et quelles sont celles qui possèdent une version asynchrone, lisez la section suivante.</p>\n</section>\n<section id=\"queryset-and-manager-methods\">\n<h3><code class=\"docutils literal notranslate\">QuerySet</code> et méthodes de gestionnaire<a class=\"heading-anchor\" href=\"#queryset-and-manager-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>Certaines méthodes de gestionnaires et de jeux de requêtes, comme <code class=\"docutils literal notranslate\">get()</code> et <code class=\"docutils literal notranslate\">first()</code>, forcent l’exécution immédiate de la requête et sont bloquantes. D’autres, comme <code class=\"docutils literal notranslate\">filter()</code> et <code class=\"docutils literal notranslate\">exclude()</code>, ne forcent pas d’exécution et peuvent donc être utilisées à partir de code asynchrone sans problème. Mais comment pouvez-vous faire cette distinction ?</p>\n<p>Bien qu’il soit possible de faire des recherches pour savoir s’il existe une version préfixée par <code class=\"docutils literal notranslate\">a</code> de ces méthodes (par exemple, <code class=\"docutils literal notranslate\">aget</code> existe, mais pas <code class=\"docutils literal notranslate\">afilter()</code>), il existe une façon plus logique : examinez de quelle sorte de méthode il s’agit dans la  <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/\"><span class=\"doc\">référence de QuerySet</span></a>.</p>\n<p>Dans cette référence, vous trouverez les méthodes de <code class=\"docutils literal notranslate\">QuerySet</code> classées en deux catégories :</p>\n<ul class=\"simple\">\n<li><p><em>Les méthodes qui renvoient de nouveaux jeux de requête</em>: celles-ci sont non bloquantes et ne possèdent pas de version asynchrone. Vous pouvez les utiliser librement dans toute situation, bien que pour <code class=\"docutils literal notranslate\">defer()</code> et <code class=\"docutils literal notranslate\">only()</code>, il est recommandé de lire les notes à leur sujet avant de les utiliser.</p></li>\n<li><p><em>Les méthodes qui ne renvoient pas de nouveaux jeux de requête</em>: celles-ci sont bloquantes et possèdent une version asynchrone. Le nom de la version asynchrone est indiqué dans leur documentation, même si le modèle standard est d’ajouter un préfixe <code class=\"docutils literal notranslate\">a</code>.</p></li>\n</ul>\n<p>Avec cette distinction, vous pouvez savoir quand vous devez utiliser les versions asynchrones et quand ce n’est pas indiqué. Par exemple, voici une requête asynchrone valable</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>user <span class=\"o\">=</span> <span class=\"k\">await</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>username<span class=\"o\">=</span>my_input<span class=\"p\">)</span><span class=\"o\">.</span>afirst<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">filter()</code> renvoie un jeu de requête et peut donc bien être utilisée dans un environnement asynchrone, alors que <code class=\"docutils literal notranslate\">first()</code> est immédiatement évaluée et renvoie une instance de modèle. Ainsi, nous la modifions en <code class=\"docutils literal notranslate\">afirst()</code> et utilisons <code class=\"docutils literal notranslate\">await</code> en préambule de toute l’expression afin de l’appeler d’une manière adéquate pour l’asynchrone.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Si vous oubliez le mot-clé <code class=\"docutils literal notranslate\">await</code>, vous pourriez voir des erreurs du genre <em>« coroutine object has no attribute x »</em> ou <em>« &lt;coroutine …&gt; »</em> au lieu de vos instances de modèle. Lorsque vous voyez ces erreurs, c’est qu’il manque un <code class=\"docutils literal notranslate\">await</code> quelque part pour transformer la coroutine en une valeur réelle.</p>\n</aside>\n</section>\n<section id=\"transactions\">\n<h3>Transactions<a class=\"heading-anchor\" href=\"#transactions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>Les transactions ne sont actuellement <strong>pas</strong> prises en charge pour les requêtes et mises à jour asynchrones. Si vous tentez de les utiliser quand même, vous obtiendrez des exceptions  <code class=\"docutils literal notranslate\">SynchronousOnlyOperation</code>.</p>\n<p>Si vous souhaitez utiliser une transaction, nous suggérons d’écrire le code ORM à l’intérieur d’une fonction synchrone séparée, puis de l’appeler en utilisant <code class=\"docutils literal notranslate\">sync_to_async</code> - voir <a class=\"reference internal\" href=\"/fr/4.1/topics/async/\"><span class=\"doc\">Gestion du code asynchrone</span></a> pour plus de détails.</p>\n</section>\n</section>\n<section id=\"querying-jsonfield\">\n<span id=\"id9\"></span><h2>Interrogation de <code class=\"docutils literal notranslate\">JSONField</code><a class=\"heading-anchor\" href=\"#querying-jsonfield\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’implémentation des interrogations est différente pour <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a>, principalement en raison de l’existence des transformations de clés. Pour le montrer, nous allons utiliser le modèle d’exemple suivant</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Dog</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    data <span class=\"o\">=</span> models<span class=\"o\">.</span>JSONField<span class=\"p\">(</span>null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</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=\"bp\">self</span><span class=\"o\">.</span>name\n</code></pre></div>\n<section id=\"storing-and-querying-for-none\">\n<h3>Stockage et requête de <code class=\"docutils literal notranslate\">None</code><a class=\"heading-anchor\" href=\"#storing-and-querying-for-none\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Comme pour les autres champs, le stockage de <code class=\"docutils literal notranslate\">None</code> comme valeur de champ enregistre une valeur SQL <code class=\"docutils literal notranslate\">NULL</code>. Même si ce n’est pas recommandé, il est possible de stocker la valeur scalaire <code class=\"docutils literal notranslate\">null</code> de JSON au lieu du <code class=\"docutils literal notranslate\">NULL</code> SQL en utilisant <a class=\"reference internal\" href=\"/fr/4.1/ref/models/expressions/#django.db.models.Value\" title=\"django.db.models.Value\"><code class=\"xref py py-class docutils literal notranslate\">Value('null')</code></a>.</p>\n<p>Quelle que soit la valeur stockée, lorsqu’elle est lue de la base de données, la représentation Python de la valeur scalaire <code class=\"docutils literal notranslate\">null</code> de JSON est la même que pour la valeur SQL <code class=\"docutils literal notranslate\">NULL</code>, c’est-à-dire <code class=\"docutils literal notranslate\">None</code>. Il peut donc être difficile de faire la distinction entre les deux.</p>\n<p>Ceci ne s’applique qu’à <code class=\"docutils literal notranslate\">None</code> comme valeur de premier niveau du champ. Si <code class=\"docutils literal notranslate\">None</code> se trouve à l’intérieur d’une structure <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#list\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">list</code></a> ou <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">dict</code></a>, elle sera toujours interprétée comme un <code class=\"docutils literal notranslate\">null</code> de JSON.</p>\n<p>Lors des requêtes, la valeur <code class=\"docutils literal notranslate\">None</code> sera toujours interprétée comme la valeur <code class=\"docutils literal notranslate\">null</code> de JSON. Pour savoir si un champ possède la valeur SQL <code class=\"docutils literal notranslate\">NULL</code>, utilisez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\">isnull</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Max&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>  <span class=\"c1\"># SQL NULL.</span>\n<span class=\"go\">&lt;Dog: Max&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Archie&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s1\">&#39;null&#39;</span><span class=\"p\">))</span>  <span class=\"c1\"># JSON null.</span>\n<span class=\"go\">&lt;Dog: Archie&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Archie&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"s1\">&#39;null&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Archie&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Max&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__isnull<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Archie&gt;]&gt;</span>\n</code></pre></div>\n<p>Sauf dans le cas où vous souhaitez vraiment travailler avec des valeurs SQL <code class=\"docutils literal notranslate\">NULL</code>, préférez le paramètre <code class=\"docutils literal notranslate\">null=False</code> et définissez une valeur par défaut convenable pour les valeurs vides, telle que <code class=\"docutils literal notranslate\">default=dict</code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le stockage de la valeur scalaire JSON <code class=\"docutils literal notranslate\">null</code> ne viole pas <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\">null=False</code></a>.</p>\n</aside>\n</section>\n<section id=\"key-index-and-path-transforms\">\n<span id=\"std-fieldlookup-jsonfield.key\"></span><h3>Transformations de clé, d’indice et de chemin<a class=\"heading-anchor\" href=\"#key-index-and-path-transforms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pour rechercher en fonction d’une clé de dictionnaire donnée, utilisez cette clé comme nom 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;other_pets&#39;</span><span class=\"p\">:</span> <span class=\"p\">[{</span>\n<span class=\"gp\">... </span>            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Fishy&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"p\">}],</span>\n<span class=\"gp\">... </span>    <span class=\"p\">},</span>\n<span class=\"gp\">... </span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"kc\">None</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__breed<span class=\"o\">=</span><span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n<p>Il est possible d’enchaîner plusieurs clés pour former une recherche de chemin :</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__owner__name<span class=\"o\">=</span><span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;]&gt;</span>\n</code></pre></div>\n<p>Si la clé est un entier, elle sera interprétée comme une transformation d’indice de tableau :</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__owner__other_pets__0__name<span class=\"o\">=</span><span class=\"s1\">&#39;Fishy&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;]&gt;</span>\n</code></pre></div>\n<p>Si la clé avec laquelle vous souhaitez rechercher entre en conflit avec le nom d’une recherche existante, utilisez la recherche <a class=\"reference internal\" href=\"#std-fieldlookup-jsonfield.contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> à la place.</p>\n<p>Pour rechercher des clés manquantes, utilisez l’expression de recherche <code class=\"docutils literal notranslate\">isnull</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Shep&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Shep&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__owner__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Shep&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Les exemples de requêtes ci-dessus utilisent implicitement la recherche <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact</code></a>. Les transformations de clé, d’indice et de chemin peuvent aussi être chaînées avec : <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-icontains\"><code class=\"xref std std-lookup docutils literal notranslate\">icontains</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-endswith\"><code class=\"xref std std-lookup docutils literal notranslate\">endswith</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-iendswith\"><code class=\"xref std std-lookup docutils literal notranslate\">iendswith</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-regex\"><code class=\"xref std std-lookup docutils literal notranslate\">regex</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-iregex\"><code class=\"xref std std-lookup docutils literal notranslate\">iregex</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-startswith\"><code class=\"xref std std-lookup docutils literal notranslate\">startswith</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-istartswith\"><code class=\"xref std std-lookup docutils literal notranslate\">istartswith</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-lt\"><code class=\"xref std std-lookup docutils literal notranslate\">lt</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-lte\"><code class=\"xref std std-lookup docutils literal notranslate\">lte</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-gt\"><code class=\"xref std std-lookup docutils literal notranslate\">gt</code></a> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-gte\"><code class=\"xref std std-lookup docutils literal notranslate\">gte</code></a>, tout comme avec <a class=\"reference internal\" href=\"#containment-and-key-lookups\"><span class=\"std std-ref\">Requêtes de contenance et de clé</span></a>.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>En raison de la façon dont les requêtes clé-chemin fonctionnent, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> ne garantissent pas la production d’ensembles exhaustifs. Si vous souhaitez inclure les objets pour lesquels le chemin n’existe pas, ajoutez l’expression <code class=\"docutils literal notranslate\">isnull</code>.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Comme n’importe quelle chaîne peut être une clé d’un objet JSON, toute recherche autre que celles mentionnées ci-dessous sera interprétée comme une recherche par clé. Aucune erreur n’est produite. Faites spécialement attention aux erreurs de frappe et vérifiez systématiquement que vos requêtes fonctionnent correctement.</p>\n</aside>\n<aside class=\"admonition-mariadb-and-oracle-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Utilisateurs MariaDB et Oracle</p>\n<p>Quand on utilise <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> sur une transformation de clé, d’indice ou de chemin, le tri des objets se fait sur la représentation textuelle des valeurs. Ceci se produit parce que les bases de données MariaDB et Oracle ne fournissent pas de fonction pour convertir les valeurs JSON en leur valeur SQL équivalente.</p>\n</aside>\n<aside class=\"admonition-oracle-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Utilisateurs Oracle</p>\n<p>Pour les bases de données Oracle, l’utilisation de <code class=\"docutils literal notranslate\">None</code> comme valeur de requête dans une requête <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> renvoie des objets qui n’ont pas <code class=\"docutils literal notranslate\">null</code> comme valeur sur le chemin indiqué, incluant aussi les objets qui n’ont pas le chemin du tout. Avec les autres moteurs de base de données, la requête renvoie les objets où le chemin indiqué existe et la valeur n’est pas <code class=\"docutils literal notranslate\">null</code>.</p>\n</aside>\n<aside class=\"admonition-postgresql-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Utilisateurs de PostgreSQL</p>\n<p>Avec PostgreSQL, si une seule clé ou indice est donnée, l’opérateur SQL <code class=\"docutils literal notranslate\">-&gt;</code> est utilisé. Si plusieurs opérateurs sont donnés, alors c’est l’opérateur <code class=\"docutils literal notranslate\">#&gt;</code> qui est utilisé.</p>\n</aside>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Utilisateurs de SQLite</p>\n<p>Avec SQLite, les valeurs de chaîne <code class=\"docutils literal notranslate\">&quot;true&quot;</code>, <code class=\"docutils literal notranslate\">&quot;false&quot;</code>, and <code class=\"docutils literal notranslate\">&quot;null&quot;</code> sont toujours interprétées respectivement comme <code class=\"docutils literal notranslate\">True</code>, <code class=\"docutils literal notranslate\">False</code>, et le <code class=\"docutils literal notranslate\">null</code> de JSON.</p>\n</aside>\n</section>\n<section id=\"containment-and-key-lookups\">\n<span id=\"id10\"></span><h3>Requêtes de contenance et de clé<a class=\"heading-anchor\" href=\"#containment-and-key-lookups\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"contains\">\n<span id=\"std-fieldlookup-jsonfield.contains\"></span><h4><code class=\"docutils literal notranslate\">contains</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>La recherche <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> est surchargée pour les champs <code class=\"docutils literal notranslate\">JSONField</code>. Les objets renvoyés sont ceux pour qui le dictionnaire de paires clé-valeur est totalement contenu au premier niveau du champ. 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n<span class=\"go\">&lt;Dog: Fred&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contains<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contains<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-oracle-and-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">Oracle et SQLite</p>\n<p><code class=\"docutils literal notranslate\">contains</code> n’est pas pris en charge avec Oracle et SQLite.</p>\n</aside>\n</section>\n<section id=\"contained-by\">\n<span id=\"std-fieldlookup-jsonfield.contained_by\"></span><h4><code class=\"docutils literal notranslate\">contained_by</code><a class=\"heading-anchor\" href=\"#contained-by\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Il s’agit de l’inverse de la recherche <a class=\"reference internal\" href=\"#std-fieldlookup-jsonfield.contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a>, les objets renvoyés sont ceux pour qui les paires de clé-valeur forment un sous-ensemble des valeurs transmises. 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n<span class=\"go\">&lt;Dog: Fred&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contained_by<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;, &lt;Dog: Fred&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contained_by<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Fred&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-oracle-and-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">Oracle et SQLite</p>\n<p><code class=\"docutils literal notranslate\">contained_by</code> n’est pas pris en charge avec Oracle et SQLite.</p>\n</aside>\n</section>\n<section id=\"has-key\">\n<span id=\"std-fieldlookup-jsonfield.has_key\"></span><h4><code class=\"docutils literal notranslate\">has_key</code><a class=\"heading-anchor\" href=\"#has-key\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Renvoie les objets où la clé donnée se trouve au premier niveau des données. 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_key<span class=\"o\">=</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"has-keys\">\n<span id=\"std-fieldlookup-jsonfield.has_any_keys\"></span><h4><code class=\"docutils literal notranslate\">has_keys</code><a class=\"heading-anchor\" href=\"#has-keys\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Renvoie les objets où toutes les clés données se trouvent au premier niveau des données. 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_keys<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"has-any-keys\">\n<span id=\"std-fieldlookup-jsonfield.has_keys\"></span><h4><code class=\"docutils literal notranslate\">has_any_keys</code><a class=\"heading-anchor\" href=\"#has-any-keys\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Renvoie les objets où au moins une des clés données se trouve au premier niveau des données. 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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Rufus&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;Dog: Meg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_any_keys<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"complex-lookups-with-q-objects\">\n<span id=\"complex-lookups-with-q\"></span><h2>Requêtes complexes avec des objets <code class=\"docutils literal notranslate\">Q</code><a class=\"heading-anchor\" href=\"#complex-lookups-with-q-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les requêtes à paramètres nommés (dans <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, etc.) sont combinées par <code class=\"docutils literal notranslate\">AND</code> (ET). 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\">OR</code> (OU)), vous pouvez utiliser des <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">objets Q</code></a>.</p>\n<p>Un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">objet Q</code></a> (<code class=\"docutils literal notranslate\">django.db.models.Q</code>) est un objet utilisé pour englober plusieurs paramètre nommés. Ces paramètre nommés sont indiqués comme pour les « Recherches dans les champs » ci-dessus.</p>\n<p>Par exemple, cet objet <code class=\"docutils literal notranslate\">Q</code> représente une seule requête <code class=\"docutils literal notranslate\">LIKE</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Q\nQ<span class=\"p\">(</span>question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les objets <code class=\"docutils literal notranslate\">Q</code> peuvent être combinés à l’aide des opérateurs <code class=\"docutils literal notranslate\">&amp;</code>, <code class=\"docutils literal notranslate\">|</code> et <code class=\"docutils literal notranslate\">^</code>. Lorsqu’un opérateur est utilisé avec deux objets <code class=\"docutils literal notranslate\">Q</code>, cela produit un nouvel objet <code class=\"docutils literal notranslate\">Q</code>.</p>\n<p>Par exemple, cette ligne produit un seul objet <code class=\"docutils literal notranslate\">Q</code> représentant la combinaison par « OR » de deux requêtes <code class=\"docutils literal notranslate\">&quot;question__startswith&quot;</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>Q<span class=\"p\">(</span>question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Who&#39;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>C’est équivalent à la clause SQL <code class=\"docutils literal notranslate\">WHERE</code> ci-dessous :</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>WHERE question LIKE <span class=\"s1\">&#39;Who%&#39;</span> OR question LIKE <span class=\"s1\">&#39;What%&#39;</span>\n</code></pre></div>\n<p>Vous pouvez composer des instructions de complexité arbitraire en combinant des objets <code class=\"docutils literal notranslate\">Q</code> avec les opérateurs <code class=\"docutils literal notranslate\">&amp;</code>, <code class=\"docutils literal notranslate\">|</code> et <code class=\"docutils literal notranslate\">^</code> et en les groupant par des parenthèses. De même, les objets <code class=\"docutils literal notranslate\">Q</code> peuvent être inversés par l’opérateur de négation <code class=\"docutils literal notranslate\">~</code>, permettant à des requêtes combinées d’utiliser à la fois des requêtes normales et des requêtes inversées (<code class=\"docutils literal notranslate\">NOT</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>Q<span class=\"p\">(</span>question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Who&#39;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"o\">~</span>Q<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Chaque fonction de recherche acceptant des paramètres nommés (par ex. <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a>) peut aussi recevoir un ou plusieurs objets <code class=\"docutils literal notranslate\">Q</code> comme paramètre positionnel (non nommé). Si vous indiquez plusieurs objets <code class=\"docutils literal notranslate\">Q</code> comme paramètres d’une fonction de recherche, les paramètres seront combinés avec « AND ». 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>Poll<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>\n    Q<span class=\"p\">(</span>question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Who&#39;</span><span class=\"p\">),</span>\n    Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">))</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>… se traduit grossièrement en SQL par :</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=\"o\">*</span> <span class=\"k\">from</span> polls <span class=\"k\">WHERE</span> question <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;Who%&#39;</span>\n    <span class=\"k\">AND</span> <span class=\"p\">(</span>pub_date <span class=\"o\">=</span> <span class=\"s1\">&#39;2005-05-02&#39;</span> <span class=\"k\">OR</span> pub_date <span class=\"o\">=</span> <span class=\"s1\">&#39;2005-05-06&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les fonctions de recherche peuvent mélanger l’utilisation d’objets <code class=\"docutils literal notranslate\">Q</code> et de paramètres nommés. Tous les paramètres fournis à une fonction de recherche (que ce soit des paramètres nommés ou des objets <code class=\"docutils literal notranslate\">Q</code>) sont combinés par l’opérateur « AND ». Cependant, si un objet <code class=\"docutils literal notranslate\">Q</code> est fourni, il doit précéder toute définition de paramètre nommé. 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>Poll<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>\n    Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">)),</span>\n    question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Who&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>… correspond à une requête valable, équivalente à l’exemple précédent ; mais :</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\"># INVALID QUERY</span>\nPoll<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>\n    question__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Who&#39;</span><span class=\"p\">,</span>\n    Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">))</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>… n’est pas correct.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Les <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.1.x/tests/or_lookups/tests.py\">exemples de requêtes OR</a> dans les tests unitaires de Django montrent quelques utilisations possibles de <code class=\"docutils literal notranslate\">Q</code>.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>La prise en charge de l’opérateur <code class=\"docutils literal notranslate\">^</code> (<code class=\"docutils literal notranslate\">XOR</code>) a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"comparing-objects\">\n<h2>Comparaison d’objets<a class=\"heading-anchor\" href=\"#comparing-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour comparer deux instances de modèle, utilisez l’opérateur de comparaison standard de Python, le double signe égal : <code class=\"docutils literal notranslate\">==</code>. En arrière-plan, ce sont les valeurs clés primaires des deux modèles qui sont comparées.</p>\n<p>En utilisant l’exemple <code class=\"docutils literal notranslate\">Entry</code> ci-dessus, les deux instructions 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=\"gp\">&gt;&gt;&gt; </span>some_entry <span class=\"o\">==</span> other_entry\n<span class=\"gp\">&gt;&gt;&gt; </span>some_entry<span class=\"o\">.</span>id <span class=\"o\">==</span> other_entry<span class=\"o\">.</span>id\n</code></pre></div>\n<p>Si la clé primaire d’un modèle ne s’appelle pas <code class=\"docutils literal notranslate\">id</code>, aucun problème. Les comparaisons utilisent toujours la clé primaire, quel que soit son nom. Par exemple, si un champ clé primaire d’un modèle s’appelle <code class=\"docutils literal notranslate\">name</code>, ces deux lignes 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=\"gp\">&gt;&gt;&gt; </span>some_obj <span class=\"o\">==</span> other_obj\n<span class=\"gp\">&gt;&gt;&gt; </span>some_obj<span class=\"o\">.</span>name <span class=\"o\">==</span> other_obj<span class=\"o\">.</span>name\n</code></pre></div>\n</section>\n<section id=\"deleting-objects\">\n<span id=\"topics-db-queries-delete\"></span><h2>Suppression d’objets<a class=\"heading-anchor\" href=\"#deleting-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La méthode de suppression se nomme <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a>. Cette méthode supprime immédiatement l’objet et renvoie le nombre d’objets supprimés ainsi qu’un dictionnaire avec le nombre de suppressions par type d’objet. 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>e<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"go\">(1, {&#39;blog.Entry&#39;: 1})</span>\n</code></pre></div>\n<p>Il est aussi possible de supprimer des objets groupés. Chaque <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> comporte une méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> qui supprime tous les objets contenus dans l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>.</p>\n<p>Par exemple, cette commande supprime tous les objets <code class=\"docutils literal notranslate\">Entry</code> dont l’année de <code class=\"docutils literal notranslate\">pub_date</code> est 2005 :</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span><span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"go\">(5, {&#39;webapp.Entry&#39;: 5})</span>\n</code></pre></div>\n<p>Sachez toutefois que cette opération sera autant que possible exécutée purement au niveau SQL, ce qui signifie que les méthodes <code class=\"docutils literal notranslate\">delete()</code> des instances individuelles ne seront pas forcément appelées durant le processus. Si vous avez écrit une méthode <code class=\"docutils literal notranslate\">delete()</code> personnalisée dans une classe de modèle et que vous voulez être certain qu’elle soit appelée, vous devrez supprimer « manuellement » les instances de ce modèle (par ex. en itérant sur un objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> et en appelant explicitement <code class=\"docutils literal notranslate\">delete()</code> sur chaque instance) plutôt que d’employer la méthode de suppression groupée <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> de l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>.</p>\n<p>Lorsque Django supprime un objet, il émule par défaut le comportement de la contrainte SQL <code class=\"docutils literal notranslate\">ON DELETE CASCADE</code>. En d’autres termes, tout objet possédant des clés étrangères vers l’objet 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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"c1\"># This will delete the Blog and all of its Entry objects.</span>\nb<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p>Ce comportement en cascade peut être personnalisé au moyen du paramètre <a class=\"reference internal\" href=\"/fr/4.1/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\">on_delete</code></a> de la classe <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>.</p>\n<p>Notez que <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> est la seule méthode de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> qui n’est pas exposée sur un objet <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a>. Il s’agit d’un mécanisme de sécurité pour vous empêcher d’exécuter accidentellement <code class=\"docutils literal notranslate\">Entry.objects.delete()</code> ce qui supprimerait <em>toutes</em> les lignes. Si vous souhaitez <em>vraiment</em> supprimer tous les objets, vous devez alors indiquer explicitement une requête contenant tous les 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span><span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"copying-model-instances\">\n<span id=\"topics-db-queries-copy\"></span><h2>Copie des instances de modèles<a class=\"heading-anchor\" href=\"#copying-model-instances\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Même s’il n’existe pas de méthode intégrée pour la copie d’instances de modèles, il est possible de créer facilement de nouvelles instances en copiant toutes les valeurs des champs d’une autre instance. Dans le cas le plus simple, on peut définir <code class=\"docutils literal notranslate\">pk</code> à <code class=\"docutils literal notranslate\">None</code> et <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\">_state.adding</code></a> to <code class=\"docutils literal notranslate\">True</code>. En utilisant notre exemple de blogue :</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>blog <span class=\"o\">=</span> Blog<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;My blog&#39;</span><span class=\"p\">,</span> tagline<span class=\"o\">=</span><span class=\"s1\">&#39;Blogging is easy&#39;</span><span class=\"p\">)</span>\nblog<span class=\"o\">.</span>save<span class=\"p\">()</span> <span class=\"c1\"># blog.pk == 1</span>\n\nblog<span class=\"o\">.</span>pk <span class=\"o\">=</span> <span class=\"kc\">None</span>\nblog<span class=\"o\">.</span>_state<span class=\"o\">.</span>adding <span class=\"o\">=</span> <span class=\"kc\">True</span>\nblog<span class=\"o\">.</span>save<span class=\"p\">()</span> <span class=\"c1\"># blog.pk == 2</span>\n</code></pre></div>\n<p>Les choses se compliquent lorsqu’il y a de l’héritage. Considérons une sous-classe de <code class=\"docutils literal notranslate\">Blog</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=\"k\">class</span> <span class=\"nc\">ThemeBlog</span><span class=\"p\">(</span>Blog<span class=\"p\">):</span>\n    theme <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n\ndjango_blog <span class=\"o\">=</span> ThemeBlog<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Django&#39;</span><span class=\"p\">,</span> tagline<span class=\"o\">=</span><span class=\"s1\">&#39;Django is easy&#39;</span><span class=\"p\">,</span> theme<span class=\"o\">=</span><span class=\"s1\">&#39;python&#39;</span><span class=\"p\">)</span>\ndjango_blog<span class=\"o\">.</span>save<span class=\"p\">()</span> <span class=\"c1\"># django_blog.pk == 3</span>\n</code></pre></div>\n<p>En raison du fonctionnement de l’héritage, vous devez définir à <code class=\"docutils literal notranslate\">None</code> à la fois <code class=\"docutils literal notranslate\">pk</code> et <code class=\"docutils literal notranslate\">id</code>, ainsi que <code class=\"docutils literal notranslate\">_state.adding</code> à <code class=\"docutils literal notranslate\">True</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>django_blog<span class=\"o\">.</span>pk <span class=\"o\">=</span> <span class=\"kc\">None</span>\ndjango_blog<span class=\"o\">.</span>id <span class=\"o\">=</span> <span class=\"kc\">None</span>\ndjango_blog<span class=\"o\">.</span>_state<span class=\"o\">.</span>adding <span class=\"o\">=</span> <span class=\"kc\">True</span>\ndjango_blog<span class=\"o\">.</span>save<span class=\"p\">()</span> <span class=\"c1\"># django_blog.pk == 4</span>\n</code></pre></div>\n<p>Ce processus ne copie pas les relations ne faisant pas partie de la table de base de données du modèle. Par exemple, <code class=\"docutils literal notranslate\">Entry</code> possède un champ <code class=\"docutils literal notranslate\">ManyToManyField</code> vers <code class=\"docutils literal notranslate\">Author</code>. Après avoir dupliqué un objet « entry », vous devez définir les relations plusieurs-à-plusieurs vers le nouvel objet :</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>entry <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"c1\"># some previous entry</span>\nold_authors <span class=\"o\">=</span> entry<span class=\"o\">.</span>authors<span class=\"o\">.</span>all<span class=\"p\">()</span>\nentry<span class=\"o\">.</span>pk <span class=\"o\">=</span> <span class=\"kc\">None</span>\nentry<span class=\"o\">.</span>_state<span class=\"o\">.</span>adding <span class=\"o\">=</span> <span class=\"kc\">True</span>\nentry<span class=\"o\">.</span>save<span class=\"p\">()</span>\nentry<span class=\"o\">.</span>authors<span class=\"o\">.</span>set<span class=\"p\">(</span>old_authors<span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour un champ <code class=\"docutils literal notranslate\">OneToOneField</code>, vous devez dupliquer l’objet lié et l’attribuer au champ correspondant du nouvel objet pour éviter la rupture de la contrainte unique du champ un-à-un. Par exemple, en supposant que <code class=\"docutils literal notranslate\">entry</code> a déjà été dupliqué comme 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>detail <span class=\"o\">=</span> EntryDetail<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\ndetail<span class=\"o\">.</span>pk <span class=\"o\">=</span> <span class=\"kc\">None</span>\ndetail<span class=\"o\">.</span>_state<span class=\"o\">.</span>adding <span class=\"o\">=</span> <span class=\"kc\">True</span>\ndetail<span class=\"o\">.</span>entry <span class=\"o\">=</span> entry\ndetail<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"updating-multiple-objects-at-once\">\n<span id=\"topics-db-queries-update\"></span><h2>Mise à jour simultanée de plusieurs objets<a class=\"heading-anchor\" href=\"#updating-multiple-objects-at-once\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il peut arriver que vous souhaitiez définir la valeur d’un certain champ pour tous les objets d’un <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>. C’est faisable à l’aide de la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\">update()</code></a>. 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\"># Update all the headlines with pub_date in 2007.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2007</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s1\">&#39;Everything is the same&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Seuls les champs qui ne sont pas des relations et les champs <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> peuvent être mis à jour avec cette méthode. Pour mettre à jour un champ qui ne représente pas une relation, indiquez la nouvelle valeur sous forme de constante. Pour mettre à jour un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, indiquez la nouvelle valeur sous forme d’une instance de modèle vers laquelle le champ devra pointer. 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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Change every Entry so that it belongs to this Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>blog<span class=\"o\">=</span>b<span class=\"p\">)</span>\n</code></pre></div>\n<p>La méthode <code class=\"docutils literal notranslate\">update()</code> est appliquée immédiatement et renvoie le nombre de lignes correspondant à la requête (ce qui ne correspond pas toujours au nombre de lignes mises à jour si certaines lignes ont déjà la bonne valeur). La seule restriction sur l’objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> mis à jour est qu’il ne peut accéder qu’à une seule table de base de données, la table principale du modèle. Vous pouvez filtrer selon des champs liés, mais vous ne pouvez mettre à jour des colonnes que dans la table principale du modèle. 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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Update all the headlines belonging to this Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog<span class=\"o\">=</span>b<span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s1\">&#39;Everything is the same&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Soyez conscient que la méthode <code class=\"docutils literal notranslate\">update()</code> est directement convertie en instruction SQL. Il s’agit d’une opération groupée pour des mises à jour directes. Elle ne fait appel à aucune méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> des modèles, n’émet aucun signal <code class=\"docutils literal notranslate\">pre_save</code> ou <code class=\"docutils literal notranslate\">post_save</code> (qui sont des conséquences de l’appel à <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>) et ne respecte pas l’option de champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\">auto_now</code></a>. Si vous souhaitez enregistrer chaque élément d’un objet <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> tout en garantissant que la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> de chaque instance est appelée, vous n’avez pas besoin d’une fonction particulière pour cela. Effectuez une boucle et appelez <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> pour chaque objet :</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> item <span class=\"ow\">in</span> my_queryset<span class=\"p\">:</span>\n    item<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Les appels à <code class=\"docutils literal notranslate\">update</code> peuvent aussi utiliser les <a class=\"reference internal\" href=\"/fr/4.1/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\">expressions F</code></a> pour mettre à jour un champ en fonction de la valeur d’un autre champ du modèle. C’est particulièrement utile pour incrémenter des compteurs en fonction de leur valeur actuelle. Par exemple, pour incrémenter le nombre de pings de chaque article d’un blogue :</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>number_of_pingbacks<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;number_of_pingbacks&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cependant, au contraire des objets <code class=\"docutils literal notranslate\">F()</code> dans les clauses <code class=\"docutils literal notranslate\">filter()</code> et <code class=\"docutils literal notranslate\">exclude()</code>, il n’est pas autorisé d’introduire des jointures lors de l’utilisation de <code class=\"docutils literal notranslate\">F()</code> dans des mises à jour ; seuls des champs du modèle en cours de mise à jour peuvent être référencés. Si vous essayez d’introduire une jointure avec un objet <code class=\"docutils literal notranslate\">F()</code>, une erreur <code class=\"docutils literal notranslate\">FieldError</code> sera générée :</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 raise a FieldError</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>headline<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s1\">&#39;blog__name&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"related-objects\">\n<span id=\"topics-db-queries-related\"></span><h2>Objets liés<a class=\"heading-anchor\" href=\"#related-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque vous définissez une relation dans un modèle (par ex. un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> ou <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>), les instances de ce modèle disposeront d’une API agréable pour accéder aux objets liés.</p>\n<p>En utilisant les modèles définis au sommet de cette page, par exemple, un objet <code class=\"docutils literal notranslate\">Entry</code> <code class=\"docutils literal notranslate\">e</code> peut atteindre son objet <code class=\"docutils literal notranslate\">Blog</code> lié en accédant à l’attribut <code class=\"docutils literal notranslate\">blog</code>: <code class=\"docutils literal notranslate\">e.blog</code>.</p>\n<p>(En arrière-plan, cette fonctionnalité est implémentée par des <a class=\"reference external\" href=\"https://docs.python.org/3/howto/descriptor.html\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-doc\">descripteurs</span></a> Python. Cela n’a pas de conséquence particulière, mais nous le mentionnons pour les curieux).</p>\n<p>Django crée également une API d’accession par l’autre côté de la relation, le lien depuis le modèle lié au modèle qui définit la relation. Par exemple, un objet <code class=\"docutils literal notranslate\">Blog</code> <code class=\"docutils literal notranslate\">b</code> peut accéder à une liste de tous les objets <code class=\"docutils literal notranslate\">Entry</code> liés par l’attribut <code class=\"docutils literal notranslate\">entry_set</code>: <code class=\"docutils literal notranslate\">b.entry_set.all()</code>.</p>\n<p>Tous les exemples de cette section utilisent les modèles d’exemple <code class=\"docutils literal notranslate\">Blog</code>, <code class=\"docutils literal notranslate\">Author</code> et <code class=\"docutils literal notranslate\">Entry</code> définis au sommet de cette page.</p>\n<section id=\"one-to-many-relationships\">\n<h3>Relations un-à-plusieurs<a class=\"heading-anchor\" href=\"#one-to-many-relationships\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"forward\">\n<h4>Sens « descendant »<a class=\"heading-anchor\" href=\"#forward\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si un modèle possède un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, les instances de ce modèle ont accès à l’objet lié par un attribut du modèle.</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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>blog <span class=\"c1\"># Returns the related Blog object.</span>\n</code></pre></div>\n<p>Un attribut d’objet lié (clé étrangère) est accessible en lecture et en écriture. Comme l’on peut s’y attendre, les modifications de la clé étrangère ne sont pas enregistrées en base de données tant que <a class=\"reference internal\" href=\"/fr/4.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> n’a pas été appelée. 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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>blog <span class=\"o\">=</span> some_blog\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Si un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> possède <code class=\"docutils literal notranslate\">null=True</code> (c’est-à-dire qu’il autorise les valeurs <code class=\"docutils literal notranslate\">NULL</code>), vous pouvez lui attribuer <code class=\"docutils literal notranslate\">None</code> pour supprimer la relation. 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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>blog <span class=\"o\">=</span> <span class=\"kc\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>e<span class=\"o\">.</span>save<span class=\"p\">()</span> <span class=\"c1\"># &quot;UPDATE blog_entry SET blog_id = NULL ...;&quot;</span>\n</code></pre></div>\n<p>L’accès « descendant » aux relations un-à-plusieurs est mis en cache lors du premier accès à l’objet lié. Les accès suivants à la clé étrangère depuis la même instance d’objet se font à partir du cache. 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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>e<span class=\"o\">.</span>blog<span class=\"p\">)</span>  <span class=\"c1\"># Hits the database to retrieve the associated Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>e<span class=\"o\">.</span>blog<span class=\"p\">)</span>  <span class=\"c1\"># Doesn&#39;t hit the database; uses cached version.</span>\n</code></pre></div>\n<p>Notez que la méthode <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> de <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> peuple de manière récursive et anticipée le cache de toutes les relations un-à-plusieurs. 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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">()</span><span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>e<span class=\"o\">.</span>blog<span class=\"p\">)</span>  <span class=\"c1\"># Doesn&#39;t hit the database; uses cached version.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>e<span class=\"o\">.</span>blog<span class=\"p\">)</span>  <span class=\"c1\"># Doesn&#39;t hit the database; uses cached version.</span>\n</code></pre></div>\n</section>\n<section id=\"following-relationships-backward\">\n<span id=\"backwards-related-objects\"></span><h4>Accès aux relations inverses<a class=\"heading-anchor\" href=\"#following-relationships-backward\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si un modèle possède un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, les instances du modèle de clé étrangère auront accès à un <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> renvoyant toutes les instances du premier modèle. Par défaut, ce <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> se nomme <code class=\"docutils literal notranslate\">XXX_set</code>, où <code class=\"docutils literal notranslate\">XXX</code> est le nom du modèle source en minuscules. Ce <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> renvoie des objets <code class=\"docutils literal notranslate\">QuerySet</code>, qui peuvent être filtrés et manipulés comme le décrit la section « Sélection d’objets » ci-dessus.</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>all<span class=\"p\">()</span> <span class=\"c1\"># Returns all Entry objects related to Blog.</span>\n\n<span class=\"go\"># b.entry_set is a Manager that returns QuerySets.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n</code></pre></div>\n<p>Il est possible de surcharger le nom <code class=\"docutils literal notranslate\">XXX_set</code> en définissant le paramètre <a class=\"reference internal\" href=\"/fr/4.1/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\">related_name</code></a> dans la définition du champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>. Par exemple, si le modèle <code class=\"docutils literal notranslate\">Entry</code> était modifié en définissant <code class=\"docutils literal notranslate\">blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries')</code>, l’exemple ci-dessus aurait été écrit 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=\"gp\">&gt;&gt;&gt; </span>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entries<span class=\"o\">.</span>all<span class=\"p\">()</span> <span class=\"c1\"># Returns all Entry objects related to Blog.</span>\n\n<span class=\"go\"># b.entries is a Manager that returns QuerySets.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entries<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b<span class=\"o\">.</span>entries<span class=\"o\">.</span>count<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-reverse-manager\">\n<span id=\"using-custom-reverse-manager\"></span><h4>Utilisation d’un gestionnaire inverse personnalisé<a class=\"heading-anchor\" href=\"#using-a-custom-reverse-manager\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Par défaut, le gestionnaire <a class=\"reference internal\" href=\"/fr/4.1/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\">RelatedManager</code></a> utilisé pour les relations inverses est une sous-classe du <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#manager-names\"><span class=\"std std-ref\">gestionnaire par défaut</span></a> du modèle. Si vous aimeriez indiquer un autre gestionnaire pour une requête précise, vous pouvez utiliser la syntaxe suivante :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Entry</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\">#...</span>\n    objects <span class=\"o\">=</span> models<span class=\"o\">.</span>Manager<span class=\"p\">()</span>  <span class=\"c1\"># Default Manager</span>\n    entries <span class=\"o\">=</span> EntryManager<span class=\"p\">()</span>    <span class=\"c1\"># Custom Manager</span>\n\nb <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\nb<span class=\"o\">.</span>entry_set<span class=\"p\">(</span>manager<span class=\"o\">=</span><span class=\"s1\">&#39;entries&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>all<span class=\"p\">()</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\">EntryManager</code> effectuait du filtrage par défaut dans sa méthode <code class=\"docutils literal notranslate\">get_queryset()</code>, ce filtrage s’appliquerait à la méthode <code class=\"docutils literal notranslate\">all()</code>.</p>\n<p>En indiquant un gestionnaire inverse personnalisé, cela permet aussi d’appeler ses méthodes personnalisé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>b<span class=\"o\">.</span>entry_set<span class=\"p\">(</span>manager<span class=\"o\">=</span><span class=\"s1\">&#39;entries&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>is_published<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"additional-methods-to-handle-related-objects\">\n<h4>Méthodes supplémentaires pour manipuler des objets liés<a class=\"heading-anchor\" href=\"#additional-methods-to-handle-related-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>En plus des méthodes <a class=\"reference internal\" href=\"/fr/4.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> présentées ci-dessus dans « Sélection d’objets », l’objet <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> d’une <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> possède des méthodes supplémentaires pour gérer l’ensemble des objets liés. Vous trouverez ci-dessous un résumé de ces méthodes et des détails plus complets peuvent être lus dans la <a class=\"reference internal\" href=\"/fr/4.1/ref/models/relations/\"><span class=\"doc\">référence des objets liés</span></a>.</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">add(obj1, obj2, ...)</code></dt><dd><p>Ajoute les objets modèles indiqués à l’ensemble des objets liés.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">create(**kwargs)</code></dt><dd><p>Crée un nouvel objet, l’enregistre et le place dans l’ensemble des objets liés. Renvoie l’objet nouvellement créé.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">remove(obj1, obj2, ...)</code></dt><dd><p>Enlève les objets modèles indiqués de l’ensemble des objets liés.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">clear()</code></dt><dd><p>Enlève tous les objets de l’ensemble des objets liés.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">set(objs)</code></dt><dd><p>Remplace l’ensemble des objets liés.</p>\n</dd>\n</dl>\n<p>Pour définir les membres d’un ensemble d’objets liés, utilisez la méthode <code class=\"docutils literal notranslate\">set()</code> avec une liste d’instances d’objets. Par exemple, si <code class=\"docutils literal notranslate\">e1</code> et <code class=\"docutils literal notranslate\">e2</code> sont des instances <code class=\"docutils literal notranslate\">Entry</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\nb<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>set<span class=\"p\">([</span>e1<span class=\"p\">,</span> e2<span class=\"p\">])</span>\n</code></pre></div>\n<p>Si la méthode <code class=\"docutils literal notranslate\">clear()</code> est disponible, tout objet pré-existant sera enlevé de <code class=\"docutils literal notranslate\">entry_set</code> avant que tous les objets de la séquence itérable (dans ce cas, une liste) soient ajoutés à l’ensemble. Si la méthode <code class=\"docutils literal notranslate\">clear()</code> <em>n’est pas</em> disponible, tous les objets de la séquence itérable sont ajoutés sans que les éléments existants ne soient enlevés.</p>\n<p>Toute opération « inverse » décrite dans cette section prend immédiatement effet au niveau de la base de données. Tout ajout, création ou suppression est immédiatement et automatiquement enregistré dans la base de données.</p>\n</section>\n</section>\n<section id=\"many-to-many-relationships\">\n<span id=\"m2m-reverse-relationships\"></span><h3>Relations plusieurs-à-plusieurs<a class=\"heading-anchor\" href=\"#many-to-many-relationships\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les deux côtés d’une relation plusieurs-à-plusieurs obtiennent automatiquement l’API d’accès à l’autre côté. L’API fonctionne de manière identique à la relation « inverse » d’une relation un-à-plusieurs décrite ci-dessus.</p>\n<p>Une des différences tient dans le nommage de l’attribut : le modèle qui définit le champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> utilise le nom d’attribut du champ lui-même, alors que le modèle « inverse » utilise le nom de modèle en minuscules du modèle original en y ajoutant <code class=\"docutils literal notranslate\">'_set'</code> (tout comme pour les relations un-à-plusieurs inverses).</p>\n<p>Un exemple va rendre tout ceci plus compréhensible :</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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\ne<span class=\"o\">.</span>authors<span class=\"o\">.</span>all<span class=\"p\">()</span> <span class=\"c1\"># Returns all Author objects for this Entry.</span>\ne<span class=\"o\">.</span>authors<span class=\"o\">.</span>count<span class=\"p\">()</span>\ne<span class=\"o\">.</span>authors<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n\na <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\na<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>all<span class=\"p\">()</span> <span class=\"c1\"># Returns all Entry objects for this Author.</span>\n</code></pre></div>\n<p>Tout comme pour <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, il est possible d’indiquer une valeur <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField.related_name\" title=\"django.db.models.ManyToManyField.related_name\"><code class=\"xref py py-attr docutils literal notranslate\">related_name</code></a> dans <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>. Dans l’exemple ci-dessus, si le champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> de <code class=\"docutils literal notranslate\">Entry</code> était défini avec <code class=\"docutils literal notranslate\">related_name='entries'</code>, chaque instance de <code class=\"docutils literal notranslate\">Author</code> posséderait un attribut <code class=\"docutils literal notranslate\">entries</code> au lieu de <code class=\"docutils literal notranslate\">entry_set</code>.</p>\n<p>Une autre différence par rapport aux relations un-à-plusieurs est qu’en plus des instances de modèles, les méthodes <code class=\"docutils literal notranslate\">add()</code>, <code class=\"docutils literal notranslate\">set()</code> et <code class=\"docutils literal notranslate\">remove()</code> des relations plusieurs-à-plusieurs acceptent des valeurs de clé primaire. Par exemple, si <code class=\"docutils literal notranslate\">e1</code> et <code class=\"docutils literal notranslate\">e2</code> sont des instances <code class=\"docutils literal notranslate\">Entry</code>, alors ces appels à <code class=\"docutils literal notranslate\">set()</code> fonctionnent de manière 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>a <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\na<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>set<span class=\"p\">([</span>e1<span class=\"p\">,</span> e2<span class=\"p\">])</span>\na<span class=\"o\">.</span>entry_set<span class=\"o\">.</span>set<span class=\"p\">([</span>e1<span class=\"o\">.</span>pk<span class=\"p\">,</span> e2<span class=\"o\">.</span>pk<span class=\"p\">])</span>\n</code></pre></div>\n</section>\n<section id=\"one-to-one-relationships\">\n<h3>Relations un-à-un<a class=\"heading-anchor\" href=\"#one-to-one-relationships\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les relations un-à-un sont très semblables aux relations plusieurs-à-un. Si vous définissez un champ <a class=\"reference internal\" href=\"/fr/4.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> dans votre modèle, les instances de ce modèle auront accès à l’objet lié via un attribut du modèle.</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=\"k\">class</span> <span class=\"nc\">EntryDetail</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    entry <span class=\"o\">=</span> models<span class=\"o\">.</span>OneToOneField<span class=\"p\">(</span>Entry<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    details <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n\ned <span class=\"o\">=</span> EntryDetail<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\ned<span class=\"o\">.</span>entry <span class=\"c1\"># Returns the related Entry object.</span>\n</code></pre></div>\n<p>La différence survient dans les requêtes « inverses ». Le modèle lié dans une relation un-à-un a aussi accès à un objet <a class=\"reference internal\" href=\"/fr/4.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a>, mais celui-ci représente un objet unique et non pas une collection 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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\ne<span class=\"o\">.</span>entrydetail <span class=\"c1\"># returns the related EntryDetail object</span>\n</code></pre></div>\n<p>Si aucun objet n’a été attribué à cette relation, Django génère une exception <code class=\"docutils literal notranslate\">DoesNotExist</code>.</p>\n<p>Il est possible d’attribuer des instances à la relation inverse sur le même principe que pour les relations descendantes :</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>e<span class=\"o\">.</span>entrydetail <span class=\"o\">=</span> ed\n</code></pre></div>\n</section>\n<section id=\"how-are-the-backward-relationships-possible\">\n<h3>Comment la relation inverse est-elle possible ?<a class=\"heading-anchor\" href=\"#how-are-the-backward-relationships-possible\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>D’autres interfaces d’abstraction objet-relationnel exigent de définir les relations des deux côtés. Les développeurs Django pensent qu’il s’agit d’une violation du principe DRY (Don’t Repeat Yourself, ne pas se répéter), c’est pourquoi Django ne demande de définir la relation que d’un seul côté.</p>\n<p>Mais comment est-ce possible, dans la mesure où une classe de modèle ne sait pas quelles autres classes de modèles lui sont liées avant que ces autres classes soient elles-mêmes chargées ?</p>\n<p>La réponse se trouve dans le <a class=\"reference internal\" href=\"/fr/4.1/ref/applications/#django.apps.apps\" title=\"django.apps.apps\"><code class=\"xref py py-data docutils literal notranslate\">registre des applications</code></a>. Lorsque Django démarre, il importe chaque application figurant dans <a class=\"reference internal\" href=\"/fr/4.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>, puis le module <code class=\"docutils literal notranslate\">models</code> dans chaque application. Chaque fois qu’une nouvelle classe est créée, Django ajoute les relations inverses aux modèles liés. Si les modèles liés n’ont pas encore été importés, Django garde la trace de ces relations et les complète au moment où les modèles concernés sont finalement importés.</p>\n<p>C’est pour cette raison qu’il est particulièrement important que tous les modèles utilisés soient définis dans des applications qui figurent dans <a class=\"reference internal\" href=\"/fr/4.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Sinon, les relations inverses pourraient ne pas fonctionner correctement.</p>\n</section>\n<section id=\"queries-over-related-objects\">\n<h3>Les requêtes sur les objets liés<a class=\"heading-anchor\" href=\"#queries-over-related-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les requêtes impliquant des objets liés suivent les mêmes règles que les requêtes contenant des valeurs de champs normales. Pour indiquer la valeur à laquelle doit correspondre une requête, vous pouvez utiliser soit une instance de l’objet lui-même, soit la valeur de clé primaire de l’objet.</p>\n<p>Par exemple, si vous avez un objet <code class=\"docutils literal notranslate\">Blog</code> <code class=\"docutils literal notranslate\">b</code> avec <code class=\"docutils literal notranslate\">id=5</code>, les trois requêtes suivantes 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog<span class=\"o\">=</span>b<span class=\"p\">)</span> <span class=\"c1\"># Query using object instance</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog<span class=\"o\">=</span>b<span class=\"o\">.</span>id<span class=\"p\">)</span> <span class=\"c1\"># Query using id from instance</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span> <span class=\"c1\"># Query using id directly</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"falling-back-to-raw-sql\">\n<h2>Recours au code SQL brut<a class=\"heading-anchor\" href=\"#falling-back-to-raw-sql\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous rencontrez le besoin de devoir écrire une requête SQL trop complexe pour l’abstraction de base de données de Django, il peut être nécessaire d’écrire le code SQL à la main. Django offre quelques options pour l’écriture de requêtes SQL brutes ; voir <a class=\"reference internal\" href=\"/fr/4.1/topics/db/sql/\"><span class=\"doc\">Lancement de requêtes SQL brutes</span></a>.</p>\n<p>Finalement, il est important de noter que la couche de base de données de Django n’est qu’une interface vers votre base de données. Vous pouvez accéder à votre base de données par d’autres outils, langages de programmation ou environnements de base de données ; il n’y a rien de spécifique à Django en ce qui concerne la base de données.</p>\n</section>","rootId":"making-queries","toc":[{"title":"Création d’objets","anchor":"creating-objects","children":[]},{"title":"Enregistrement des modifications d’objets","anchor":"saving-changes-to-objects","children":[{"title":"Enregistrement des champs ForeignKey et ManyToManyField","anchor":"saving-foreignkey-and-manytomanyfield-fields","children":[]}]},{"title":"Sélection d’objets","anchor":"retrieving-objects","children":[{"title":"Sélection de tous les objets","anchor":"retrieving-all-objects","children":[]},{"title":"Sélection d’objets spécifiques avec les filtres","anchor":"retrieving-specific-objects-with-filters","children":[{"title":"Enchaînement des filtres","anchor":"chaining-filters","children":[]},{"title":"Les QuerySet filtrés sont uniques","anchor":"filtered-querysets-are-unique","children":[]},{"title":"Les objects QuerySet sont différés","anchor":"querysets-are-lazy","children":[]}]},{"title":"Sélection d’un objet unique avec get()","anchor":"retrieving-a-single-object-with-get","children":[]},{"title":"Autres méthodes de QuerySet","anchor":"other-queryset-methods","children":[]},{"title":"Limitation des QuerySet","anchor":"limiting-querysets","children":[]},{"title":"Recherches dans les champs","anchor":"field-lookups","children":[]},{"title":"Recherches traversant les relations","anchor":"lookups-that-span-relationships","children":[{"title":"Traversée des relations multivaluées","anchor":"spanning-multi-valued-relationships","children":[]}]},{"title":"Les filtres peuvent référencer les champs d’un modèle","anchor":"filters-can-reference-fields-on-the-model","children":[]},{"title":"Les expressions peuvent référencer des transformations","anchor":"expressions-can-reference-transforms","children":[]},{"title":"Le raccourci de recherche pk","anchor":"the-pk-lookup-shortcut","children":[]},{"title":"Échappement des signes pour cent et des soulignements dans les instructions LIKE","anchor":"escaping-percent-signs-and-underscores-in-like-statements","children":[]},{"title":"Mise en cache et objets QuerySet","anchor":"caching-and-querysets","children":[{"title":"Quand les objets QuerySet ne sont pas mis en cache","anchor":"when-querysets-are-not-cached","children":[]}]}]},{"title":"Requêtes asynchrones","anchor":"asynchronous-queries","children":[{"title":"Requêtes et itération","anchor":"query-iteration","children":[]},{"title":"QuerySet et méthodes de gestionnaire","anchor":"queryset-and-manager-methods","children":[]},{"title":"Transactions","anchor":"transactions","children":[]}]},{"title":"Interrogation de JSONField","anchor":"querying-jsonfield","children":[{"title":"Stockage et requête de None","anchor":"storing-and-querying-for-none","children":[]},{"title":"Transformations de clé, d’indice et de chemin","anchor":"key-index-and-path-transforms","children":[]},{"title":"Requêtes de contenance et de clé","anchor":"containment-and-key-lookups","children":[{"title":"contains","anchor":"contains","children":[]},{"title":"contained_by","anchor":"contained-by","children":[]},{"title":"has_key","anchor":"has-key","children":[]},{"title":"has_keys","anchor":"has-keys","children":[]},{"title":"has_any_keys","anchor":"has-any-keys","children":[]}]}]},{"title":"Requêtes complexes avec des objets Q","anchor":"complex-lookups-with-q-objects","children":[]},{"title":"Comparaison d’objets","anchor":"comparing-objects","children":[]},{"title":"Suppression d’objets","anchor":"deleting-objects","children":[]},{"title":"Copie des instances de modèles","anchor":"copying-model-instances","children":[]},{"title":"Mise à jour simultanée de plusieurs objets","anchor":"updating-multiple-objects-at-once","children":[]},{"title":"Objets liés","anchor":"related-objects","children":[{"title":"Relations un-à-plusieurs","anchor":"one-to-many-relationships","children":[{"title":"Sens « descendant »","anchor":"forward","children":[]},{"title":"Accès aux relations inverses","anchor":"following-relationships-backward","children":[]},{"title":"Utilisation d’un gestionnaire inverse personnalisé","anchor":"using-a-custom-reverse-manager","children":[]},{"title":"Méthodes supplémentaires pour manipuler des objets liés","anchor":"additional-methods-to-handle-related-objects","children":[]}]},{"title":"Relations plusieurs-à-plusieurs","anchor":"many-to-many-relationships","children":[]},{"title":"Relations un-à-un","anchor":"one-to-one-relationships","children":[]},{"title":"Comment la relation inverse est-elle possible ?","anchor":"how-are-the-backward-relationships-possible","children":[]},{"title":"Les requêtes sur les objets liés","anchor":"queries-over-related-objects","children":[]}]},{"title":"Recours au code SQL brut","anchor":"falling-back-to-raw-sql","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/4.1/topics/"},{"docname":"topics/db/index","title":"Modèles et bases de données","url":"/fr/4.1/topics/db/"}],"prev":{"docname":"topics/db/models","title":"Modèles","url":"/fr/4.1/topics/db/models/"},"next":{"docname":"topics/db/aggregation","title":"Agrégation","url":"/fr/4.1/topics/db/aggregation/"},"formats":{"html":"/fr/4.1/topics/db/queries/","markdown":"/fr/4.1/topics/db/queries.md","json":"/fr/4.1/topics/db/queries.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/topics/db/queries.txt","official":"https://docs.djangoproject.com/fr/4.1/topics/db/queries/","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"]}