{"title":"L’API _meta des modèles","version":"2.1","locale":"fr","docname":"ref/models/meta","url":"/fr/2.1/ref/models/meta/","canonical":"https://djangodocs.dev/fr/2.1/ref/models/meta/","summary":"class Options Lien vers cette définition # L’API _meta des modèles est au cœur de l’ORM de Django. Elle permet à d’autres parties du système telles que les…","html":"<span id=\"model-meta-api\"></span><h1>L’API <code class=\"docutils literal notranslate\"><span class=\"pre\">_meta</span></code> des modèles<a class=\"heading-anchor\" href=\"#module-django.db.models.options\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Options</span></span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>L’API <code class=\"docutils literal notranslate\"><span class=\"pre\">_meta</span></code> des modèles est au cœur de l’ORM de Django. Elle permet à d’autres parties du système telles que les recherches, les requêtes, les formulaires et le site d’administration de comprendre les capacités de chaque modèle. L’API est accessible au travers de l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">_meta</span></code> de chaque classe de modèle, qui est une instance d’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.options.Options</span></code>.</p>\n<p>Les méthodes qu’elle fournit peuvent être utilisées pour :</p>\n<ul class=\"simple\">\n<li><p>Récupérer toutes les instances de champ d’un modèle</p></li>\n<li><p>Récupérer une instance de champ unique d’un modèle par son nom</p></li>\n</ul>\n<section id=\"field-access-api\">\n<span id=\"model-meta-field-api\"></span><h2>API d’accès aux champs<a class=\"heading-anchor\" href=\"#field-access-api\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"retrieving-a-single-field-instance-of-a-model-by-name\">\n<h3>Récupération d’une instance de champ unique d’un modèle par son nom<a class=\"heading-anchor\" href=\"#retrieving-a-single-field-instance-of-a-model-by-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options.get_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options.get_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie une instance de champ correspondant au nom indiqué.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> peut être le nom d’un champ du modèle, d’un champ d’un modèle abstrait ou hérité, ou d’un champ défini sur un autre modèle pointant vers ce modèle. Dans ce dernier cas, <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> est (par ordre de préférence) le nom <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> défini par l’utilisateur, le nom <a class=\"reference internal\" href=\"/fr/2.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\"><span class=\"pre\">related_name</span></code></a> défini par l’utilisateur ou le nom généré automatiquement par Django.</p>\n<p>Les <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.Field.hidden\" title=\"django.db.models.Field.hidden\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">champs</span> <span class=\"pre\">cachés</span></code></a> ne peuvent pas être récupérés par leur nom.</p>\n<p>Si aucun champ du nom indiqué n’a été trouvé, une exception <a class=\"reference internal\" href=\"/fr/2.1/ref/exceptions/#django.core.exceptions.FieldDoesNotExist\" title=\"django.core.exceptions.FieldDoesNotExist\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FieldDoesNotExist</span></code></a> est générée.</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n\n<span class=\"go\"># A field on the model</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_field</span><span class=\"p\">(</span><span class=\"s1\">&#39;username&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;django.db.models.fields.CharField: username&gt;</span>\n\n<span class=\"go\"># A field from another model that has a relation with the current model</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_field</span><span class=\"p\">(</span><span class=\"s1\">&#39;logentry&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;ManyToOneRel: admin.logentry&gt;</span>\n\n<span class=\"go\"># A non existent field</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_field</span><span class=\"p\">(</span><span class=\"s1\">&#39;does_not_exist&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"w\">    </span><span class=\"o\">...</span>\n<span class=\"gr\">FieldDoesNotExist</span>: <span class=\"n\">User has no field named &#39;does_not_exist&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"retrieving-all-field-instances-of-a-model\">\n<h3>Récupération de toutes les instances de champ d’un modèle<a class=\"heading-anchor\" href=\"#retrieving-all-field-instances-of-a-model\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options.get_fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_fields</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_parents</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_hidden</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options.get_fields\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie un tuple de champs associés à un modèle. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_fields()</span></code> accepte deux paramètres pouvant être utilisés pour contrôler quels champs sont renvoyés :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">include_parents</span></code></dt><dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> par défaut. Inclut récursivement les champs définis dans les classes parentes. Lorsque ce paramètre est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_fields()</span></code> ne renvoie que les champs déclarés directement sur le modèle concerné. Les champs de modèles qui héritent directement de modèles abstraits ou de classes mandataires sont considérés comme locaux, et non pas définis sur le parent.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">include_hidden</span></code></dt><dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> par défaut. Lorsque ce paramètre est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_fields()</span></code> inclut les champs utilisés pour fournir des fonctionnalités d’autres champs. Cela comprend également les champs possédant un nom <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> (tels que <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> et <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>) qui commence par un « + ».</p>\n</dd>\n</dl>\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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n<span class=\"go\">(&lt;ManyToOneRel: admin.logentry&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.AutoField: id&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: password&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: last_login&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_superuser&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: username&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: first_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: last_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.EmailField: email&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_staff&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_active&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: date_joined&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: groups&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: user_permissions&gt;)</span>\n\n<span class=\"go\"># Also include hidden fields.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">(</span><span class=\"n\">include_hidden</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;ManyToOneRel: auth.user_groups&gt;,</span>\n<span class=\"go\"> &lt;ManyToOneRel: auth.user_user_permissions&gt;,</span>\n<span class=\"go\"> &lt;ManyToOneRel: admin.logentry&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.AutoField: id&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: password&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: last_login&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_superuser&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: username&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: first_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: last_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.EmailField: email&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_staff&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_active&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: date_joined&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: groups&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: user_permissions&gt;)</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"migrating-from-the-old-api\">\n<span id=\"migrating-old-meta-api\"></span><h2>Migration à partir de l’ancienne API<a class=\"heading-anchor\" href=\"#migrating-from-the-old-api\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dans le cadre de la formalisation de l’API <code class=\"docutils literal notranslate\"><span class=\"pre\">Model._meta</span></code> (de la classe <a class=\"reference internal\" href=\"#django.db.models.options.Options\" title=\"django.db.models.options.Options\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.options.Options</span></code></a>), un certain nombre de méthodes et de propriétés ont été rendues obsolètes et seront supprimées dans Django 1.10.</p>\n<p>Ces anciennes API peuvent être reproduites, soit en :</p>\n<ul class=\"simple\">\n<li><p>invoquant <a class=\"reference internal\" href=\"#django.db.models.options.Options.get_field\" title=\"django.db.models.options.Options.get_field\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Options.get_field()</span></code></a>, ou;</p></li>\n<li><p>en invoquant <a class=\"reference internal\" href=\"#django.db.models.options.Options.get_fields\" title=\"django.db.models.options.Options.get_fields\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Options.get_fields()</span></code></a> pour récupérer une liste de tous les champs, puis en filtrant cette liste à l’aide des <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#model-field-attributes\"><span class=\"std std-ref\">attributs de champ</span></a> qui décrivent (ou récupèrent, dans le cas des variantes <code class=\"docutils literal notranslate\"><span class=\"pre\">_with_model</span></code>) les propriétés des champs souhaités.</p></li>\n</ul>\n<p>Même s’il est possible de créer des remplacements strictement équivalents des anciennes méthodes, ce n’est pas forcément la meilleure approche. Prendre le temps de recréer les énumérations de champs afin de faire meilleur usage de la nouvelle API, en incluant potentiellement des champs qui étaient précédemment exclus, aboutira certainement à un code plus propre.</p>\n<p>En supposant qu’un modèle est nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel</span></code>, il est possible de procéder aux substitutions suivantes pour convertir du code à la nouvelle API :</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_field(name)</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" 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\">f</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_field</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>puis vérifier si :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f.auto_created</span> <span class=\"pre\">==</span> <span class=\"pre\">False</span></code>, parce que la nouvelle API <code class=\"docutils literal notranslate\"><span class=\"pre\">get_field()</span></code> va renvoyer les relations « inverses », et :</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f.is_relation</span> <span class=\"pre\">and</span> <span class=\"pre\">f.related_model</span> <span class=\"pre\">is</span> <span class=\"pre\">None</span></code>, parce que la nouvelle API <code class=\"docutils literal notranslate\"><span class=\"pre\">get_field()</span></code> va renvoyer les relations <a class=\"reference internal\" href=\"/fr/2.1/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a>.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_field_by_name(name)</span></code> renvoie un tuple de ces quatre valeurs avec les remplacements suivants :</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> peut être trouvé par <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_field(name)</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> peut être trouvé par l’attribut <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.Field.model\" title=\"django.db.models.Field.model\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">model</span></code></a> du champ.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">direct</span></code> peut être trouvé par : <code class=\"docutils literal notranslate\"><span class=\"pre\">not</span> <span class=\"pre\">field.auto_created</span> <span class=\"pre\">or</span> <span class=\"pre\">field.concrete</span></code></p>\n<p>Le contrôle <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.Field.auto_created\" title=\"django.db.models.Field.auto_created\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_created</span></code></a> exclut toute relation « vers l’avant » ou « inverse » créée par Django, mais cela comprend également les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">AutoField</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> sur les modèles mandataires. Nous évitons d’exclure ces champs à l’aide de l’attribut <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.Field.concrete\" title=\"django.db.models.Field.concrete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">concrete</span></code></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">m2m</span></code> peut être trouvé au moyen de l’attribut <a class=\"reference internal\" href=\"/fr/2.1/ref/models/fields/#django.db.models.Field.many_to_many\" title=\"django.db.models.Field.many_to_many\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">many_to_many</span></code></a> du champ.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_fields_with_model()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span> <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_relation</span>\n        <span class=\"ow\">or</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_one</span>\n        <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">many_to_one</span> <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">related_model</span><span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_concrete_fields_with_model()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span> <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">concrete</span> <span class=\"ow\">and</span> <span class=\"p\">(</span>\n        <span class=\"ow\">not</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_relation</span>\n        <span class=\"ow\">or</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_one</span>\n        <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">many_to_one</span> <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">related_model</span><span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_m2m_with_model()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span> <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">many_to_many</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">auto_created</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_all_related_objects()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"n\">f</span> <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_many</span> <span class=\"ow\">or</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_one</span><span class=\"p\">)</span>\n    <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">auto_created</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">concrete</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_all_related_objects_with_model()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span> <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_many</span> <span class=\"ow\">or</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">one_to_one</span><span class=\"p\">)</span>\n    <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">auto_created</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">concrete</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_all_related_many_to_many_objects()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"n\">f</span> <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">(</span><span class=\"n\">include_hidden</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">many_to_many</span> <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">auto_created</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_all_related_m2m_objects_with_model()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span> <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">(</span><span class=\"n\">include_hidden</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">many_to_many</span> <span class=\"ow\">and</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">auto_created</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel._meta.get_all_field_names()</span></code> devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">chain</span>\n<span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">chain</span><span class=\"o\">.</span><span class=\"n\">from_iterable</span><span class=\"p\">(</span>\n    <span class=\"p\">(</span><span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">attname</span><span class=\"p\">)</span> <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">field</span><span class=\"p\">,</span> <span class=\"s1\">&#39;attname&#39;</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"p\">(</span><span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,)</span>\n    <span class=\"k\">for</span> <span class=\"n\">field</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()</span>\n    <span class=\"c1\"># For complete backwards compatibility, you may want to exclude</span>\n    <span class=\"c1\"># GenericForeignKey from the results.</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">many_to_one</span> <span class=\"ow\">and</span> <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">related_model</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"p\">)))</span>\n</code></pre></div>\n<p>Cela fournit un remplacement 100 % rétrocompatible, garantissant que les noms de champ et les noms d’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> sont inclus, mais que les champs associés à <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> ne le sont pas. Une version simplifiée pourrait être :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">()]</span>\n</code></pre></div>\n<p>Même si cette variante n’est pas rétrocompatible à 100 %, elle peut suffire dans bien des situations.</p>\n</li>\n</ul>\n</section>","rootId":"module-django.db.models.options","toc":[{"title":"API d’accès aux champs","anchor":"field-access-api","children":[{"title":"Récupération d’une instance de champ unique d’un modèle par son nom","anchor":"retrieving-a-single-field-instance-of-a-model-by-name","children":[]},{"title":"Récupération de toutes les instances de champ d’un modèle","anchor":"retrieving-all-field-instances-of-a-model","children":[]}]},{"title":"Migration à partir de l’ancienne API","anchor":"migrating-from-the-old-api","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/indexes","title":"Référence des index de modèle","url":"/fr/2.1/ref/models/indexes/"},"next":{"docname":"ref/models/relations","title":"Référence des objets liés","url":"/fr/2.1/ref/models/relations/"},"formats":{"html":"/fr/2.1/ref/models/meta/","markdown":"/fr/2.1/ref/models/meta.md","json":"/fr/2.1/ref/models/meta.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/ref/models/meta.txt","official":"https://docs.djangoproject.com/fr/2.1/ref/models/meta/","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"]}