{"title":"L’API _meta des modèles","version":"1.9","locale":"fr","docname":"ref/models/meta","url":"/fr/1.9/ref/models/meta/","canonical":"https://djangodocs.dev/fr/1.9/ref/models/meta/","summary":"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 recherches, les requêtes, les formulaires…","html":"<span id=\"model-meta-api\"></span><h1>L’API <code class=\"docutils literal notranslate\">_meta</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\">class</span> </em><span class=\"sig-name descname\">Options</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\">_meta</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\">_meta</code> de chaque classe de modèle, qui est une instance d’objet <code class=\"docutils literal notranslate\">django.db.models.options.Options</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<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>L’API <code class=\"docutils literal notranslate\">_meta</code> de la classe <code class=\"docutils literal notranslate\">Model</code> a toujours existé de manière interne à Django, mais n’était jusqu’ici pas documentée ni prise en charge formellement. Dans le cadre du travail de publication de cette API, certains points d’entrée de l’API existante ont été légèrement modifiés. Un <a class=\"reference internal\" href=\"#migrating-old-meta-api\"><span class=\"std std-ref\">guide de migration</span></a> vous est proposé pour aider à convertir du code à la nouvelle API officielle.</p>\n</aside>\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\">Options.</span><span class=\"sig-name descname\">get_field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field_name</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\">field_name</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\">field_name</code> est en fait le nom <code class=\"docutils literal notranslate\">related_name</code> défini par l’utilisateur ou généré automatiquement par Django lui-même.</p>\n<p>Les <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.Field.hidden\" title=\"django.db.models.Field.hidden\"><code class=\"xref py py-attr docutils literal notranslate\">champs cachés</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/1.9/ref/exceptions/#django.core.exceptions.FieldDoesNotExist\" title=\"django.core.exceptions.FieldDoesNotExist\"><code class=\"xref py py-class docutils literal notranslate\">FieldDoesNotExist</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=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n\n<span class=\"go\"># A field on the model</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<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>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<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>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<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=\"o\">...</span>\n<span class=\"gr\">FieldDoesNotExist</span>: User has no field named &#39;does_not_exist&#39;\n</code></pre></div>\n<aside class=\"version-note version-deprecated\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 1.8</p><p><span class=\"versionmodified deprecated\">Obsolète depuis la version 1.8: </span><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\">Options.get_field()</code></a> acceptait précédemment un paramètre <code class=\"docutils literal notranslate\">many_to_many</code> qui pouvait être défini à <code class=\"docutils literal notranslate\">False</code> pour éviter de renvoyer des <code class=\"docutils literal notranslate\">ManyToManyField</code>. L’ancien comportement a été préservé par rétrocompatibilité ; cependant, le paramètre et son comportement sont obsolètes.</p>\n<p>Si vous souhaitez exclure les champs <code class=\"docutils literal notranslate\">ManyToManyField</code>, vous pouvez inspecter l’attribut <a class=\"reference internal\" href=\"/fr/1.9/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\">Field.many_to_many</code></a> après avoir appelé <code class=\"docutils literal notranslate\">get_field()</code>.</p>\n</aside>\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\">Options.</span><span class=\"sig-name descname\">get_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">include_parents<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">include_hidden<span class=\"o\">=</span><span class=\"default_value\">False</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><aside class=\"version-note version-added\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p>Renvoie un tuple de champs associés à un modèle. <code class=\"docutils literal notranslate\">get_fields()</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\">include_parents</code></dt><dd><p><code class=\"docutils literal notranslate\">True</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\">False</code>, <code class=\"docutils literal notranslate\">get_fields()</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\">include_hidden</code></dt><dd><p><code class=\"docutils literal notranslate\">False</code> par défaut. Lorsque ce paramètre est défini à <code class=\"docutils literal notranslate\">True</code>, <code class=\"docutils literal notranslate\">get_fields()</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\">related_name</code> (tels que <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> et <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</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=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<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>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<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\">Model._meta</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\">django.db.models.options.Options</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\">Options.get_field()</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\">Options.get_fields()</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/1.9/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\">_with_model</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\">MyModel</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\">MyModel._meta.get_field(name)</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>f <span class=\"o\">=</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<span class=\"p\">(</span>name<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\">f.auto_created == False</code>, parce que la nouvelle API <code class=\"docutils literal notranslate\">get_field()</code> va renvoyer les relations « inverses », et :</p></li>\n<li><p><code class=\"docutils literal notranslate\">f.is_relation and f.related_model is None</code>, parce que la nouvelle API <code class=\"docutils literal notranslate\">get_field()</code> va renvoyer les relations <a class=\"reference internal\" href=\"/fr/1.9/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a>.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_field_by_name(name)</code> renvoie un tuple de ces quatre valeurs avec les remplacements suivants :</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">field</code> peut être trouvé par <code class=\"docutils literal notranslate\">MyModel._meta.get_field(name)</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">model</code> peut être trouvé par l’attribut <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.Field.model\" title=\"django.db.models.Field.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> du champ.</p></li>\n<li><p><code class=\"docutils literal notranslate\">direct</code> peut être trouvé par : <code class=\"docutils literal notranslate\">not field.auto_created or field.concrete</code></p>\n<p>Le contrôle <a class=\"reference internal\" href=\"/fr/1.9/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\">auto_created</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\">AutoField</code> et <code class=\"docutils literal notranslate\">OneToOneField</code> sur les modèles mandataires. Nous évitons d’exclure ces champs à l’aide de l’attribut <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.Field.concrete\" title=\"django.db.models.Field.concrete\"><code class=\"xref py py-attr docutils literal notranslate\">concrete</code></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">m2m</code> peut être trouvé au moyen de l’attribut <a class=\"reference internal\" href=\"/fr/1.9/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\">many_to_many</code></a> du champ.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_fields_with_model()</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>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>is_relation\n        <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one\n        <span class=\"ow\">or</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> f<span class=\"o\">.</span>related_model<span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_concrete_fields_with_model()</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>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>concrete <span class=\"ow\">and</span> <span class=\"p\">(</span>\n        <span class=\"ow\">not</span> f<span class=\"o\">.</span>is_relation\n        <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one\n        <span class=\"ow\">or</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> f<span class=\"o\">.</span>related_model<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\">MyModel._meta.get_m2m_with_model()</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>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_objects()</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    f <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>one_to_many <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one<span class=\"p\">)</span>\n    <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>concrete\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_objects_with_model()</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>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>one_to_many <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one<span class=\"p\">)</span>\n    <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>concrete\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_many_to_many_objects()</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    f <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_m2m_objects_with_model()</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>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_field_names()</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=\"nn\">itertools</span> <span class=\"kn\">import</span> chain\n<span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">set</span><span class=\"p\">(</span>chain<span class=\"o\">.</span>from_iterable<span class=\"p\">(</span>\n    <span class=\"p\">(</span>field<span class=\"o\">.</span>name<span class=\"p\">,</span> field<span class=\"o\">.</span>attname<span class=\"p\">)</span> <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span>field<span class=\"p\">,</span> <span class=\"s1\">&#39;attname&#39;</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"p\">(</span>field<span class=\"o\">.</span>name<span class=\"p\">,)</span>\n    <span class=\"k\">for</span> field <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<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>field<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> field<span class=\"o\">.</span>related_model <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\">ForeignKey</code> sont inclus, mais que les champs associés à <code class=\"docutils literal notranslate\">GenericForeignKey</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>f<span class=\"o\">.</span>name <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<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/1.9/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/1.9/ref/models/"}],"prev":{"docname":"ref/models/fields","title":"Référence des champs de modèle","url":"/fr/1.9/ref/models/fields/"},"next":{"docname":"ref/models/relations","title":"Référence des objets liés","url":"/fr/1.9/ref/models/relations/"},"formats":{"html":"/fr/1.9/ref/models/meta/","markdown":"/fr/1.9/ref/models/meta.md","json":"/fr/1.9/ref/models/meta.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/ref/models/meta.txt","official":"https://docs.djangoproject.com/fr/1.9/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","fr","ja","id","pt-br","es"]}