{"title":"Options Meta des modèles","version":"2.1","locale":"fr","docname":"ref/models/options","url":"/fr/2.1/ref/models/options/","canonical":"https://djangodocs.dev/fr/2.1/ref/models/options/","summary":"Ce document explique toutes les options de métadonnées qu’il est possible d’attribuer aux modèles dans leur classe Meta interne. Options Meta disponibles Lien vers…","html":"<h1>Options <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> des modèles<a class=\"heading-anchor\" href=\"#model-meta-options\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document explique toutes les <a class=\"reference internal\" href=\"/fr/2.1/topics/db/models/#meta-options\"><span class=\"std std-ref\">options de métadonnées</span></a> qu’il est possible d’attribuer aux modèles dans leur classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> interne.</p>\n<section id=\"available-meta-options\">\n<h2>Options <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> disponibles<a class=\"heading-anchor\" href=\"#available-meta-options\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"abstract\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">abstract</span></code><a class=\"heading-anchor\" href=\"#abstract\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.abstract\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">abstract</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.abstract\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>, ce modèle sera une <a class=\"reference internal\" href=\"/fr/2.1/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">classe de base abstraite</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"app-label\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code><a class=\"heading-anchor\" href=\"#app-label\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.app_label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">app_label</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.app_label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si un modèle est défini en dehors d’une application dans <a class=\"reference internal\" href=\"/fr/2.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, il doit déclarer à quelle application il appartient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">app_label</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;myapp&#39;</span>\n</code></pre></div>\n<p>Si vous souhaitez représenter un modèle avec le format  <code class=\"docutils literal notranslate\"><span class=\"pre\">étiquette_app.nom_objet</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">étiquette_app.nom_modèle</span></code>, vous pouvez respectivement utiliser  <code class=\"docutils literal notranslate\"><span class=\"pre\">model._meta.label</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">model._meta.label_lower</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"base-manager-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">base_manager_name</span></code><a class=\"heading-anchor\" href=\"#base-manager-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.base_manager_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">base_manager_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.base_manager_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom du gestionnaire à utiliser pour l’attribut <a class=\"reference internal\" href=\"/fr/2.1/topics/db/managers/#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a> du modèle.</p>\n</dd></dl>\n\n</section>\n<section id=\"db-table\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code><a class=\"heading-anchor\" href=\"#db-table\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.db_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">db_table</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.db_table\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de la table de base de données à utiliser pour le 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=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;music_album&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<section id=\"table-names\">\n<span id=\"id1\"></span><h4>Noms de tables<a class=\"heading-anchor\" href=\"#table-names\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour vous faire gagner du temps, Django dérive automatiquement le nom de la table de base de données du nom de la classe de modèle et de l’application dans laquelle elle se trouve. Un nom de table de base de données d’un modèle est construit en adjoignant le « label » d’application du modèle (le nom utilisé lors de la commande <a class=\"reference internal\" href=\"/fr/2.1/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span></code></a>) au nom de classe du modèle, combinés par un soulignement.</p>\n<p>Par exemple, pour une application <code class=\"docutils literal notranslate\"><span class=\"pre\">bibliotheque</span></code> (qui serait créée avec <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span> <span class=\"pre\">bibliotheque</span></code>) et un modèle défini par <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Livre</span></code>, le nom de la table de base de données serait <code class=\"docutils literal notranslate\"><span class=\"pre\">bibliotheque_livre</span></code>.</p>\n<p>Pour surcharger le nom de la table de base de données, utilisez l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code> de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>.</p>\n<p>Si votre nom de table de base de données est un mot SQL réservé ou s’il contient des caractères non autorisés dans des noms de variables Python (en particulier le trait d’union), il n’y a pas de souci à se faire. Django place entre guillemets les noms de colonnes et de tables en arrière-plan.</p>\n<aside class=\"admonition-use-lowercase-table-names-for-mysql admonition\">\n<p class=\"admonition-title\">Noms de tables en minuscules pour MySQL</p>\n<p>Il est fortement conseillé d’écrire les noms de tables en minuscules lors de leur surcharge avec <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code>, particulièrement lorsqu’on utilise le moteur MySQL. Voir les <a class=\"reference internal\" href=\"/fr/2.1/ref/databases/#mysql-notes\"><span class=\"std std-ref\">notes pour MySQL</span></a> pour plus de détails.</p>\n</aside>\n<aside class=\"admonition-table-name-quoting-for-oracle admonition\">\n<p class=\"admonition-title\">Noms de tables entre guillemets pour Oracle</p>\n<p>Afin de respecter la limite de 30 caractères qu’Oracle impose aux noms de tables et pour suivre les conventions habituelles des bases de données Oracle, Django peut raccourcir les noms de tables et les transformer en majuscules. Pour empêcher ces transformations, écrivez des valeurs entre guillemets dans <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;name_left_in_lowercase&quot;&#39;</span>\n</code></pre></div>\n<p>Il est aussi possible d’utiliser de tels noms entre guillemets avec les autres moteurs de base de données pris en charge par Django ; cependant, contrairement à Oracle, les guillemets n’ont pas d’effet. Voir les <a class=\"reference internal\" href=\"/fr/2.1/ref/databases/#oracle-notes\"><span class=\"std std-ref\">notes sur Oracle</span></a> pour plus de détails.</p>\n</aside>\n</section>\n</section>\n<section id=\"db-tablespace\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">db_tablespace</span></code><a class=\"heading-anchor\" href=\"#db-tablespace\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.db_tablespace\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">db_tablespace</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.db_tablespace\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de l”<a class=\"reference internal\" href=\"/fr/2.1/topics/db/tablespaces/\"><span class=\"doc\">espace de tables de base de données</span></a> à utiliser pour ce modèle. La valeur par défaut est le réglage <a class=\"reference internal\" href=\"/fr/2.1/ref/settings/#std-setting-DEFAULT_TABLESPACE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_TABLESPACE</span></code></a> du projet, s’il est défini. Si le moteur ne prend pas en charge les espaces de tables, cette option est ignorée.</p>\n</dd></dl>\n\n</section>\n<section id=\"default-manager-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager_name</span></code><a class=\"heading-anchor\" href=\"#default-manager-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.default_manager_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_manager_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_manager_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom du gestionnaire à utiliser pour l’attribut <a class=\"reference internal\" href=\"/fr/2.1/topics/db/managers/#django.db.models.Model._default_manager\" title=\"django.db.models.Model._default_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code></a> du modèle.</p>\n</dd></dl>\n\n</section>\n<section id=\"default-related-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_related_name</span></code><a class=\"heading-anchor\" href=\"#default-related-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.default_related_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_related_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_related_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom qui sera utilisé par défaut pour la relation depuis un objet lié vers cet objet. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;nom_modèle&gt;_set</span></code>.</p>\n<p>Cette option définit également <a class=\"reference internal\" href=\"/fr/2.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\"><span class=\"pre\">related_query_name</span></code></a>.</p>\n<p>Comme le nom inverse d’un champ doit être unique, faites attention si vous créez une sous-classe du modèle. Pour contourner les collisions de noms, une partie du nom devrait contenir <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(model_name)s'</span></code>, qui sont respectivement remplacés par le nom de l’application contenant le modèle, et le nom du modèle, les deux en minuscules. Consultez le paragraphe sur les <a class=\"reference internal\" href=\"/fr/2.1/topics/db/models/#abstract-related-name\"><span class=\"std std-ref\">noms de liaison des modèles abstraits</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"get-latest-by\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code><a class=\"heading-anchor\" href=\"#get-latest-by\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.get_latest_by\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_latest_by</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.get_latest_by\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom d’un champ ou une liste de noms de champs du modèle, typiquement un champ <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a>, <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> ou <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a>. Cette option définit le ou les champs par défaut à utiliser dans les méthodes <a class=\"reference internal\" href=\"/fr/2.1/ref/models/querysets/#django.db.models.query.QuerySet.latest\" title=\"django.db.models.query.QuerySet.latest\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">latest()</span></code></a> et <a class=\"reference internal\" href=\"/fr/2.1/ref/models/querysets/#django.db.models.query.QuerySet.earliest\" title=\"django.db.models.query.QuerySet.earliest\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">earliest()</span></code></a> du gestionnaire (<a class=\"reference internal\" href=\"/fr/2.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a>) 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=\"c1\"># Latest by ascending order_date.</span>\n<span class=\"n\">get_latest_by</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;order_date&quot;</span>\n\n<span class=\"c1\"># Latest by priority descending, order_date ascending.</span>\n<span class=\"n\">get_latest_by</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;-priority&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;order_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Voir la documentation de <a class=\"reference internal\" href=\"/fr/2.1/ref/models/querysets/#django.db.models.query.QuerySet.latest\" title=\"django.db.models.query.QuerySet.latest\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">latest()</span></code></a> pour plus de détails.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.0\">\n<p class=\"version-note-title\">Changed in Django 2.0</p><p>La prise en charge d’une liste de champs a été ajoutée.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"managed\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">managed</span></code><a class=\"heading-anchor\" href=\"#managed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.managed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">managed</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.managed\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, signifiant que Django crée les tables de base de données adéquates dans <a class=\"reference internal\" href=\"/fr/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> ou dans le cadre des migrations et les efface dans le contexte de la commande d’administration <a class=\"reference internal\" href=\"/fr/2.1/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a>. C’est-à-dire que Django <em>pilote</em> le cycle de vie des tables de la base de données.</p>\n<p>Si la valeur est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, aucune opération de création ou de suppression de table de base de données n’est effectuée pour ce modèle. Utile si le modèle représente une table existante ou une vue de base de données qui a été créée par un autre moyen. C’est l’<em>unique</em> différence lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code>. Tous les autres aspects de la gestion des modèles sont traités comme pour un modèle normal. Cela inclut :</p>\n<ol class=\"arabic\">\n<li><p>L’ajout automatique d’un champ de clé primaire au modèle si aucun n’est déclaré. Pour enlever toute confusion possible aux lecteurs de votre code, il est recommandé d’indiquer toutes les colonnes de la table de base de données que vous modélisez en utilisant des modèles non pilotés.</p></li>\n<li><p>Si un modèle avec <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> contient un champ <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> qui pointe vers un autre modèle non piloté, la table intermédiaire de la relation plusieurs-à-plusieurs ne sera pas non plus créée. Cependant, la table intermédiaire entre un modèle piloté et un modèle non piloté <em>sera</em> bel et bien créée.</p>\n<p>Si vous aimeriez changer ce comportement par défaut, créez explicitement le modèle de la table intermédiaire (avec l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">managed</span></code> appropriée) et utilisez l’attribut <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ManyToManyField.through</span></code></a> pour que la relation utilise le modèle ainsi créé.</p>\n</li>\n</ol>\n<p>En ce qui concerne les tests impliquant des modèles avec <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code>, c’est à vous de vous assurer que les tables correctes soient créées dans le cadre de la mise en place des tests.</p>\n<p>Si vous êtes intéressé à modifier le comportement Python d’une classe de modèle, vous <em>pourriez</em> utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> et créer une copie d’un modèle existant. Cependant, il existe une meilleure approche pour ce genre de situation : <a class=\"reference internal\" href=\"/fr/2.1/topics/db/models/#proxy-models\"><span class=\"std std-ref\">Modèles mandataires</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"order-with-respect-to\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code><a class=\"heading-anchor\" href=\"#order-with-respect-to\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.order_with_respect_to\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">order_with_respect_to</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.order_with_respect_to\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Rend cet objet « triable » en fonction du champ donné, presque toujours un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code>. Cela peut être utilisé pour permettre à des objets liés d’être triés en fonction d’un objet parent. Par exemple, si un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> (réponse) est lié à un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> et qu’une question possède plus d’une réponse et que l’ordre des réponses est signifiant, voici comment cela serait défini :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"c1\"># ...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Answer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">order_with_respect_to</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;question&#39;</span>\n</code></pre></div>\n<p>Lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> est défini, deux méthodes complémentaires sont fournies pour récupérer et définir l’ordre des objets liés : <code class=\"docutils literal notranslate\"><span class=\"pre\">get_RELATED_order()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">set_RELATED_order()</span></code>, où <code class=\"docutils literal notranslate\"><span class=\"pre\">RELATED</span></code> est le nom du modèle en minuscules. Par exemple, en supposant qu’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> possède plusieurs objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> liés, la liste renvoyée contient les clés primaires des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> liés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">get_answer_order</span><span class=\"p\">()</span>\n<span class=\"go\">[1, 2, 3]</span>\n</code></pre></div>\n<p>L’ordre des objets liés <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> peut être défini en passant une liste de clés primaires d’objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">set_answer_order</span><span class=\"p\">([</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Les objets liés reçoivent aussi deux méthodes, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_next_in_order()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">get_previous_in_order()</span></code>, qui peuvent être utilisées pour accéder à ces objets dans l’ordre correct. En supposant que les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> sont triés par <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span> <span class=\"o\">=</span> <span class=\"n\">Answer</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span><span class=\"o\">.</span><span class=\"n\">get_next_in_order</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;Answer: 3&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span><span class=\"o\">.</span><span class=\"n\">get_previous_in_order</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;Answer: 1&gt;</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"admonition-order-with-respect-to-implicitly-sets-the-ordering-option admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> définit implicitement l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code>.</p>\n<p>En interne, <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> ajoute un champ (colonne de base de données) supplémentaire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">_order</span></code> et définit l’option <a class=\"reference internal\" href=\"#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ordering</span></code></a> du modèle avec ce champ. Par conséquent, <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code> ne peuvent pas être utilisés conjointement, et l’ordre de tri ajouté par <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> s’applique chaque fois que vous obtenez une liste d’objets pour ce modèle.</p>\n</aside>\n<aside class=\"admonition-changing-order-with-respect-to admonition\">\n<p class=\"admonition-title\">Modification de <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code></p>\n<p>Comme <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> ajoute une colonne de base de données supplémentaire, il vous revient donc de créer et d’appliquer les migrations appropriées si vous ajoutez ou modifiez <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> après la création initiale opérée par <a class=\"reference internal\" href=\"/fr/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"ordering\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code><a class=\"heading-anchor\" href=\"#ordering\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.ordering\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">ordering</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.ordering\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le tri par défaut des objets, lors de l’obtention de listes d’objets :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;-order_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Il s’agit d’un tuple ou d’une liste de chaînes, ou d’expressions de requête. Chaque chaîne correspond à un nom de champ, facultativement préfixée par « - » indiquant un tri descendant. Les champs sans préfixe « - » sont triés dans l’ordre ascendant. Indiquez la chaîne « ? » pour trier de façon aléatoire.</p>\n<p>Par exemple, pour trier sur un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> dans l’ordre ascendant, indiquez :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Pour trier par <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> dans l’ordre descendant, indiquez :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Pour trier par <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> dans l’ordre descendant, puis par <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> dans l’ordre ascendant, indiquez :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;author&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Il est aussi possible d’utiliser des <a class=\"reference internal\" href=\"/fr/2.1/ref/models/expressions/\"><span class=\"doc\">expressions de requête</span></a>. Pour trier par <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> dans l’ordre croissant et pour que les valeurs nulles apparaissent en dernier, écrivez ceci</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n\n<span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;author&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">asc</span><span class=\"p\">(</span><span class=\"n\">nulls_last</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)]</span>\n</code></pre></div>\n<p>Le tri par défaut affecte également les <a class=\"reference internal\" href=\"/fr/2.1/topics/db/aggregation/#aggregation-ordering-interaction\"><span class=\"std std-ref\">requêtes d’agrégation</span></a>.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.0\">\n<p class=\"version-note-title\">Changed in Django 2.0</p><p>La prise en charge des expressions de requête a été ajoutée.</p>\n</aside>\n</dd></dl>\n\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Le tri n’est pas une opération anodine. Chaque champ ajouté dans les critères de tri implique un coût au niveau de la base de données. Chaque clé étrangère ajoutée inclut aussi implicitement tous ses champs de tri par défaut.</p>\n<p>Si une requête ne possède pas d’ordre de tri, les résultats sont renvoyés de la base de données dans un ordre non défini. Un ordre particulier ne peut être garanti que si l’ordre se base sur un ou des champs qui identifient chaque objet du résultat de manière unique. Par exemple, si un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">nom</span></code> n’est pas unique, le tri par ce champ ne garantit pas que les objets de même nom apparaissent toujours dans le même ordre.</p>\n</aside>\n</section>\n<section id=\"permissions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code><a class=\"heading-anchor\" href=\"#permissions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.permissions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">permissions</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.permissions\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Permissions supplémentaires à intégrer dans la table des permissions lors de la création de cet objet. Les permissions d’ajout, de modification, de suppression et d’affichage sont automatiquement créées pour tous les modèles. Cet exemple ajoute une permission supplémentaire, <code class=\"docutils literal notranslate\"><span class=\"pre\">can_deliver_pizzas</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">permissions</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s2\">&quot;can_deliver_pizzas&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can deliver pizzas&quot;</span><span class=\"p\">),)</span>\n</code></pre></div>\n<p>Il s’agit d’une liste ou d’un tuple de tuples binaires dans le format <code class=\"docutils literal notranslate\"><span class=\"pre\">(code_permission,</span> <span class=\"pre\">nom_verbeux_permission)</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"default-permissions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_permissions</span></code><a class=\"heading-anchor\" href=\"#default-permissions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.default_permissions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_permissions</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_permissions\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Contient <code class=\"docutils literal notranslate\"><span class=\"pre\">('add',</span> <span class=\"pre\">'change',</span> <span class=\"pre\">'delete',</span> <span class=\"pre\">'view')</span></code> par défaut. Vous pouvez ajuster cette liste, par exemple en définissant une liste vide si votre application n’a besoin d’aucune permission par défaut. Les permissions doivent être définies pour le modèle avant que celui-ci ne soit créé par <a class=\"reference internal\" href=\"/fr/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> afin d’éviter la création de permissions non utilisées.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.1\">\n<p class=\"version-note-title\">Changed in Django 2.1</p><p>La permission <code class=\"docutils literal notranslate\"><span class=\"pre\">view</span></code> a été ajoutée.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"proxy\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">proxy</span></code><a class=\"heading-anchor\" href=\"#proxy\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.proxy\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">proxy</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.proxy\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">proxy</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>, un modèle qui hérite d’un autre modèle sera considéré comme un <a class=\"reference internal\" href=\"/fr/2.1/topics/db/models/#proxy-models\"><span class=\"std std-ref\">modèle mandataire</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"required-db-features\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">required_db_features</span></code><a class=\"heading-anchor\" href=\"#required-db-features\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.required_db_features\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">required_db_features</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.required_db_features\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Liste de fonctionnalités de base de données que la connexion en cours devrait avoir pour que le modèle soit considéré pendant la phase de migration. Par exemple, si cette liste contient <code class=\"docutils literal notranslate\"><span class=\"pre\">['gis_enabled']</span></code>, le modèle ne sera synchronisé qu’avec les bases de données possédant des fonctionnalités SIG. Ceci est également utile pour omettre certains modèles lors de tests avec plusieurs moteurs de base de données différents. Évitez les relations avec ces modèles qui sont créés conditionnellement car l’ORM ne sait pas comment traiter ces cas.</p>\n</dd></dl>\n\n</section>\n<section id=\"required-db-vendor\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">required_db_vendor</span></code><a class=\"heading-anchor\" href=\"#required-db-vendor\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.required_db_vendor\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">required_db_vendor</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.required_db_vendor\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Nom d’un fournisseur de base de données pour lequel ce modèle est spécifique. Les noms des fournisseurs intégrés actuels sont : <code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">oracle</span></code>. Si cet attribut n’est pas vide et que le fournisseur de la connexion actuelle ne correspond pas, le modèle n’est pas synchronisé.</p>\n</dd></dl>\n\n</section>\n<section id=\"select-on-save\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">select_on_save</span></code><a class=\"heading-anchor\" href=\"#select-on-save\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.select_on_save\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">select_on_save</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.select_on_save\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Détermine si Django utilise l’algorithme <a class=\"reference internal\" href=\"/fr/2.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.db.models.Model.save()</span></code></a> d’avant la version 1.6. L’ancien algorithme utilise <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> pour savoir s’il y a une ligne existant à mettre à jour. Le nouvel algorithme essaie directement un <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>. Dans de rares cas, la mise à jour par <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code> d’une ligne existante n’est pas visible par Django. Un des exemples est le déclencheur <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span> <span class=\"pre\">UPDATE</span></code> de PostgreSQL qui renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>. Dans de telles situations, le nouvel algorithme effectue finalement un <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> même quand une ligne existe déjà dans la base de données.</p>\n<p>Il n’y a habituellement pas besoin de définir cet attribut. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/2.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.db.models.Model.save()</span></code></a> pour plus de détails sur l’ancien et le nouvel algorithme d’enregistrement.</p>\n</dd></dl>\n\n</section>\n<section id=\"indexes\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">indexes</span></code><a class=\"heading-anchor\" href=\"#indexes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.indexes\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">indexes</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.indexes\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une liste des <a class=\"reference internal\" href=\"/fr/2.1/ref/models/indexes/\"><span class=\"doc\">index</span></a> que vous souhaitez définir pour le 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Customer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">indexes</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Index</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">]),</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Index</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;first_name_idx&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"unique-together\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code><a class=\"heading-anchor\" href=\"#unique-together\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.unique_together\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">unique_together</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.unique_together\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Noms de champs qui forment ensemble des index uniques :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s2\">&quot;driver&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;restaurant&quot;</span><span class=\"p\">),)</span>\n</code></pre></div>\n<p>Il s’agit d’un tuple de tuples dont les valeurs combinées doivent être uniques. Utilisé dans l’administration de Django et appliqué au niveau base de données (c’est-à-dire que les commandes <code class=\"docutils literal notranslate\"><span class=\"pre\">UNIQUE</span></code> appropriées sont inclues dans les commandes <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>).</p>\n<p>Par commodité, <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> peut être formé d’un seul tuple lorsqu’un seul groupe de champs est défini :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s2\">&quot;driver&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;restaurant&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il n’est pas possible d’inclure un champ <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> (il n’est même pas évident de savoir ce que ça signifierait). Si vous avez besoin de valider de l’unicité au niveau d’un champ <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a>, essayez d’utiliser un signal ou un modèle <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">through</span></code></a> explicite.</p>\n<p>L’exception <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> générée durant la validation du modèle lorsque la contrainte est violée possède le code d’erreur <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"index-together\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code><a class=\"heading-anchor\" href=\"#index-together\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.index_together\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">index_together</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.index_together\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"admonition-use-the-attr-options-indexes-option-instead admonition\">\n<p class=\"admonition-title\">Utilisez plutôt l’option  <a class=\"reference internal\" href=\"#django.db.models.Options.indexes\" title=\"django.db.models.Options.indexes\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">indexes</span></code></a>.</p>\n<p>L’option <a class=\"reference internal\" href=\"#django.db.models.Options.indexes\" title=\"django.db.models.Options.indexes\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">indexes</span></code></a>, plus récente, offre plus de fonctionnalités qu” <code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code>. `` index_together`` peut être dépréciée dans le futur.</p>\n</aside>\n<p>Noms de champs qui forment ensemble des index :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">index_together</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;deadline&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Cette liste de champs formera un index combiné (c’est-à-dire que la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">INDEX</span></code> appropriée sera produite).</p>\n<p>Par commodité, <code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code> peut être formé d’une seule liste lorsqu’un seul groupe de champs est défini :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">index_together</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;deadline&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"verbose-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code><a class=\"heading-anchor\" href=\"#verbose-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.verbose_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">verbose_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.verbose_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un nom verbeux pour l’objet, au singulier :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;pizza&quot;</span>\n</code></pre></div>\n<p>Si cette option est absente, Django manipule le nom de la classe : <code class=\"docutils literal notranslate\"><span class=\"pre\">CamelCase</span></code> devient <code class=\"docutils literal notranslate\"><span class=\"pre\">camel</span> <span class=\"pre\">case</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"verbose-name-plural\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code><a class=\"heading-anchor\" href=\"#verbose-name-plural\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.verbose_name_plural\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">verbose_name_plural</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.verbose_name_plural\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom verbeux pluriel pour 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=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;stories&quot;</span>\n</code></pre></div>\n<p>Si cette option est absente, Django utilise <a class=\"reference internal\" href=\"#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> et y ajoute un « s ».</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"read-only-meta-attributes\">\n<h2>Attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> en lecture seule<a class=\"heading-anchor\" href=\"#read-only-meta-attributes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"label\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code><a class=\"heading-anchor\" href=\"#label\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Représentation de l’objet, renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.object_name</span></code>, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.Question'</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"label-lower\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">label_lower</span></code><a class=\"heading-anchor\" href=\"#label-lower\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Options.label_lower\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label_lower</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.label_lower\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Représentation du modèle, renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.model_name</span></code>, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.question'</span></code>.</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"model-meta-options","toc":[{"title":"Options Meta disponibles","anchor":"available-meta-options","children":[{"title":"abstract","anchor":"abstract","children":[]},{"title":"app_label","anchor":"app-label","children":[]},{"title":"base_manager_name","anchor":"base-manager-name","children":[]},{"title":"db_table","anchor":"db-table","children":[{"title":"Noms de tables","anchor":"table-names","children":[]}]},{"title":"db_tablespace","anchor":"db-tablespace","children":[]},{"title":"default_manager_name","anchor":"default-manager-name","children":[]},{"title":"default_related_name","anchor":"default-related-name","children":[]},{"title":"get_latest_by","anchor":"get-latest-by","children":[]},{"title":"managed","anchor":"managed","children":[]},{"title":"order_with_respect_to","anchor":"order-with-respect-to","children":[]},{"title":"ordering","anchor":"ordering","children":[]},{"title":"permissions","anchor":"permissions","children":[]},{"title":"default_permissions","anchor":"default-permissions","children":[]},{"title":"proxy","anchor":"proxy","children":[]},{"title":"required_db_features","anchor":"required-db-features","children":[]},{"title":"required_db_vendor","anchor":"required-db-vendor","children":[]},{"title":"select_on_save","anchor":"select-on-save","children":[]},{"title":"indexes","anchor":"indexes","children":[]},{"title":"unique_together","anchor":"unique-together","children":[]},{"title":"index_together","anchor":"index-together","children":[]},{"title":"verbose_name","anchor":"verbose-name","children":[]},{"title":"verbose_name_plural","anchor":"verbose-name-plural","children":[]}]},{"title":"Attributs Meta en lecture seule","anchor":"read-only-meta-attributes","children":[{"title":"label","anchor":"label","children":[]},{"title":"label_lower","anchor":"label-lower","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.1/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/2.1/ref/models/"}],"prev":{"docname":"ref/models/class","title":"Référence de la classe Model","url":"/fr/2.1/ref/models/class/"},"next":{"docname":"ref/models/instances","title":"Référence des instances de modèles","url":"/fr/2.1/ref/models/instances/"},"formats":{"html":"/fr/2.1/ref/models/options/","markdown":"/fr/2.1/ref/models/options.md","json":"/fr/2.1/ref/models/options.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/ref/models/options.txt","official":"https://docs.djangoproject.com/fr/2.1/ref/models/options/","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","pt-br","ko","es","el","pl"]}