{"title":"L’infrastructure des types de contenus (contenttypes)","version":"3.0","locale":"fr","docname":"ref/contrib/contenttypes","url":"/fr/3.0/ref/contrib/contenttypes/","canonical":"https://djangodocs.dev/fr/3.0/ref/contrib/contenttypes/","summary":"Django inclut une application contenttypes qui permet de recenser l’ensemble des modèles installés dans un projet Django, fournissant une interface générique de…","html":"<span id=\"the-contenttypes-framework\"></span><h1>L’infrastructure des types de contenus (contenttypes)<a class=\"heading-anchor\" href=\"#module-django.contrib.contenttypes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django inclut une application <a class=\"reference internal\" href=\"#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">contenttypes</span></code></a> qui permet de recenser l’ensemble des modèles installés dans un projet Django, fournissant une interface générique de haut niveau pour travailler avec les modèles.</p>\n<section id=\"overview\">\n<h2>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le cœur de l’application contenttypes est le modèle <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>, définir dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.models.ContentType</span></code>. Les instances de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> représentent et stockent des informations sur les modèles installés dans un projet ; de nouvelles instances de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> sont automatiquement créées à chaque fois que de nouveaux modèles sont installés.</p>\n<p>Les instances de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> ont des méthodes pour renvoyer les classes de modèle qu’elles représentent et pour interroger les objets de ces modèles. <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> dispose également d’un <a class=\"reference internal\" href=\"/fr/3.0/topics/db/managers/#custom-managers\"><span class=\"std std-ref\">gestionnaire personnalisé</span></a> qui ajoute des méthodes pour travailler avec <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> et pour obtenir des instances de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> pour un modèle particulier.</p>\n<p>Les relations entre vos modèles et <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> peuvent également être utilisées pour établir des relations « génériques » entre une instance d’un de vos modèles et des instances de n’importe quel autre modèle que vous avez installé.</p>\n</section>\n<section id=\"installing-the-contenttypes-framework\">\n<h2>Installation du système contenttypes<a class=\"heading-anchor\" href=\"#installing-the-contenttypes-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le système contenttypes est inclus par défaut dans la liste <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> créée par <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code>, mais si vous l’avez supprimé ou si vous définissez manuellement votre liste <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, vous pouvez l’activer en ajoutant <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.contenttypes'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>C’est généralement une bonne idée d’avoir l’application contenttypes installée ; plusieurs autres applications fournies avec Django ont en besoin :</p>\n<ul class=\"simple\">\n<li><p>L’application d’administration l’utilise pour tracer l’historique de chaque objet ajouté ou modifié via l’interface d’administration.</p></li>\n<li><p>Le <a class=\"reference internal\" href=\"/fr/3.0/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">système</span> <span class=\"pre\">d'authentification</span></code></a> de Django l’utilise pour associer les permissions des utilisateurs à des modèles spécifiques.</p></li>\n</ul>\n</section>\n<section id=\"the-contenttype-model\">\n<h2>Le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code><a class=\"heading-anchor\" href=\"#the-contenttype-model\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType\">\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\">ContentType</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Chaque instance de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> a deux champs qui, pris ensemble, décrivent de manière unique un modèle installé :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType.app_label\">\n<span class=\"sig-name descname\"><span class=\"pre\">app_label</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType.app_label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de l’application dont le modèle fait partie. Il provient de l’attribut <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.app_label\" title=\"django.contrib.contenttypes.models.ContentType.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> du modèle et ne comprend que la <em>dernière</em> partie du chemin d’importation Python de l’application ; par exemple, l’attribut <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.app_label\" title=\"django.contrib.contenttypes.models.ContentType.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes</span></code> devient <code class=\"docutils literal notranslate\"><span class=\"pre\">contenttypes</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType.model\">\n<span class=\"sig-name descname\"><span class=\"pre\">model</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType.model\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de classe du modèle.</p>\n</dd></dl>\n\n<p>De plus, la propriété suivante est disponible :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType.name\">\n<span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom lisible du type de contenu. Il provient de l’attribut <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> du modèle.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Examinons un exemple pour voir comment cela fonctionne. Si l’application <a class=\"reference internal\" href=\"#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">contenttypes</span></code></a> est déjà installée, que vous ajoutez ensuite l’application <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/sites/#module-django.contrib.sites\" title=\"django.contrib.sites: Lets you operate multiple websites from the same database and Django project\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">sites</span></code></a> à votre réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> et que vous exécutez <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> pour l’installer, le modèle <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/sites/#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.models.Site</span></code></a> sera installé dans votre base de données. Dans le même temps, une nouvelle instance de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> sera créée avec les valeurs suivantes :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.app_label\" title=\"django.contrib.contenttypes.models.ContentType.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> sera défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">'sites'</span></code> (la dernière partie du chemin Python de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code>).</p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.model\" title=\"django.contrib.contenttypes.models.ContentType.model\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">model</span></code></a> sera défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">'site'</span></code>.</p></li>\n</ul>\n</section>\n<section id=\"methods-on-contenttype-instances\">\n<h2>Méthodes des instances <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code><a class=\"heading-anchor\" href=\"#methods-on-contenttype-instances\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Chaque instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> possède des méthodes qui permettent de passer d’une instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> au modèle qu’elle représente, ou de récupérer des objets à partir de ce modèle :</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType.get_object_for_this_type\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ContentType.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_object_for_this_type</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType.get_object_for_this_type\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Accepte un ensemble de <a class=\"reference internal\" href=\"/fr/3.0/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">paramètres de recherche</span></a> valides pour le modèle que <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> représente, et réalise <a class=\"reference internal\" href=\"/fr/3.0/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">une</span> <span class=\"pre\">recherche</span> <span class=\"pre\">get()</span></code></a> sur ce modèle, renvoyant l’objet correspondant.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentType.model_class\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ContentType.</span></span><span class=\"sig-name descname\"><span class=\"pre\">model_class</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentType.model_class\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la classe du modèle représenté par cette instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>.</p>\n</dd></dl>\n\n<p>Par exemple, nous pourrions chercher le <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> du modèle <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">app_label</span><span class=\"o\">=</span><span class=\"s1\">&#39;auth&#39;</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s1\">&#39;user&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user_type</span>\n<span class=\"go\">&lt;ContentType: user&gt;</span>\n</code></pre></div>\n<p>Puis l’utiliser pour rechercher un <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> particulier ou pour accéder à la classe du modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">User</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\">user_type</span><span class=\"o\">.</span><span class=\"n\">model_class</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;class &#39;django.contrib.auth.models.User&#39;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user_type</span><span class=\"o\">.</span><span class=\"n\">get_object_for_this_type</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;Guido&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;User: Guido&gt;</span>\n</code></pre></div>\n<p>Ensemble, <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.get_object_for_this_type\" title=\"django.contrib.contenttypes.models.ContentType.get_object_for_this_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_object_for_this_type()</span></code></a> et <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType.model_class\" title=\"django.contrib.contenttypes.models.ContentType.model_class\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">model_class()</span></code></a> permettent deux cas d’utilisation extrêmement importants :</p>\n<ol class=\"arabic simple\">\n<li><p>En utilisant ces méthodes, vous pouvez écrire du code générique de haut niveau qui effectue des requêtes sur n’importe quel modèle installé ; au lieu d’importer et d’utiliser une unique classe de modèle spécifique, vous pouvez passer des variables <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> pour chercher un objet <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> au moment de l’exécution, et travailler ensuite avec la classe de modèle ou récupérer des objets avec.</p></li>\n<li><p>Vous pouvez associer un autre modèle à un objet <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> afin de lier ses instances à certaines classes de modèle, et utiliser ces méthodes pour obtenir l’accès à ces classes de modèle.</p></li>\n</ol>\n<p>Plusieurs des applications intégrées à Django font usage de cette dernière technique. Par exemple, le <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.Permission\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">système</span> <span class=\"pre\">de</span> <span class=\"pre\">permissions</span></code></a> dans le système d’authentification de Django utilise un modèle <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.Permission\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Permission</span></code></a> avec une clé étrangère vers <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>; cela permet à <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.Permission\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Permission</span></code></a> de représenter des concepts tels que « peut ajouter une entrée de blog » ou « peut supprimer une actualité ».</p>\n<section id=\"the-contenttypemanager\">\n<h3>Le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentTypeManager</span></code><a class=\"heading-anchor\" href=\"#the-contenttypemanager\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager\">\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\">ContentTypeManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> possède aussi un gestionnaire personnalisé, <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentTypeManager\" title=\"django.contrib.contenttypes.models.ContentTypeManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentTypeManager</span></code></a>, qui ajoute les méthodes suivantes :</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager.clear_cache\">\n<span class=\"sig-name descname\"><span class=\"pre\">clear_cache</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.clear_cache\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Efface un cache interne utilisé par <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> pour garder une trace des modèles pour lesquels il a créé des instances <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>. Vous n’aurez probablement jamais besoin d’appeler cette méthode de vous-même ; Django l’appelle automatiquement lorsque c’est nécessaire.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_id\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_for_id</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">id</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_id\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Recherche un <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> par son identifiant. Comme cette méthode utilise le même cache partagé que <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_model\" title=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_for_model()</span></code></a>, il est préférable d’utiliser cette méthode à l’habituel <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType.objects.get</span> <span class=\"pre\">(pk=id)</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_model\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_for_model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">for_concrete_model</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_model\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Accepte soit une classe de modèle, soit une instance de modèle, et renvoie l’instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> représentant ce modèle. <code class=\"docutils literal notranslate\"><span class=\"pre\">for_concrete_model=False</span></code> permet de récupérer l’instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> d’un modèle mandataire.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_models\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_for_models</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">models</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">for_concrete_models</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_models\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Accepte un nombre variable de classes de modèle et renvoie un dictionnaire associant les classes de modèle aux instances <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> qui les représentent. <code class=\"docutils literal notranslate\"><span class=\"pre\">for_concrete_model=False</span></code> permet de récupérer les instances <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> de modèles mandataires.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.models.ContentTypeManager.get_by_natural_key\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_by_natural_key</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_label</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_by_natural_key\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie l’instance <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> identifiée de façon unique par l’étiquette d’application et le nom du modèle donnés. L’objectif principal de cette méthode est de permettre aux objets <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> d’être référencés par une <a class=\"reference internal\" href=\"/fr/3.0/topics/serialization/#topics-serialization-natural-keys\"><span class=\"std std-ref\">clé naturelle</span></a> pendant la désérialisation.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>La méthode <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_model\" title=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_for_model()</span></code></a> est particulièrement utile lorsque vous savez que vous devez travailler avec un <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> mais que vous ne voulez pas vous soucier d’obtenir les métadonnées du modèle pour effectuer une recherche manuelle :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.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\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;ContentType: user&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"generic-relations\">\n<span id=\"module-django.contrib.contenttypes.fields\"></span><span id=\"id1\"></span><h2>Relations génériques<a class=\"heading-anchor\" href=\"#generic-relations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’ajout d’une clé étrangère depuis l’un de vos propres modèles vers un <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> permet au modèle de se lier efficacement à une autre classe de modèle, comme dans l’exemple du modèle <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/auth/#django.contrib.auth.models.Permission\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Permission</span></code></a> ci-dessus. Mais il est possible d’aller encore plus loin et d’utiliser <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> pour permettre de véritables relations génériques (parfois appelées « polymorphes ») entre les modèles.</p>\n<p>Par exemple, on pourrait l’utiliser pour un système d’étiquetage comme ceci</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.fields</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">GenericForeignKey</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n<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\">TaggedItem</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\">tag</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">SlugField</span><span class=\"p\">()</span>\n    <span class=\"n\">content_type</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\">ContentType</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=\"n\">object_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">PositiveIntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">content_object</span> <span class=\"o\">=</span> <span class=\"n\">GenericForeignKey</span><span class=\"p\">(</span><span class=\"s1\">&#39;content_type&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;object_id&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tag</span>\n</code></pre></div>\n<p>Une clé <a class=\"reference internal\" href=\"/fr/3.0/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> normale ne peut « pointer » que vers un seul autre modèle, ce qui signifie que si le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</span></code> utilisait une clé <a class=\"reference internal\" href=\"/fr/3.0/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>, il devrait choisir un et un seul modèle pour stocker les étiquettes associées. L’application contenttypes fournit un type de champ spécial (<code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code>) qui résout cette problématique et permet que la relation se fasse avec n’importe quel modèle :</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.fields.GenericForeignKey\">\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\">GenericForeignKey</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.fields.GenericForeignKey\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Il y a trois étapes à suivre pour mettre en place une <a class=\"reference internal\" href=\"#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>\n<ol class=\"arabic simple\">\n<li><p>Ajoutez à votre modèle une clé <a class=\"reference internal\" href=\"/fr/3.0/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> vers <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>. Le nom usuel de ce champ est « content_type ».</p></li>\n<li><p>Ajoutez à votre modèle un champ qui peut stocker des valeurs de clé primaire provenant des modèles qui feront l’objet du lien. Pour la plupart des modèles, cela correspond à un champ <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.PositiveIntegerField\" title=\"django.db.models.PositiveIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveIntegerField</span></code></a>. Le nom usuel de ce champ est « object_id ».</p></li>\n<li><p>Ajoutez à votre modèle une clé <a class=\"reference internal\" href=\"#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> en lui passant les noms des deux champs décrits ci-dessus. Si ces champs sont nommés « content_type » et « object_id », vous pouvez les omettre, car ce sont les noms de champs par défaut que <a class=\"reference internal\" href=\"#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> va chercher.</p></li>\n</ol>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.fields.GenericForeignKey.for_concrete_model\">\n<span class=\"sig-name descname\"><span class=\"pre\">for_concrete_model</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.fields.GenericForeignKey.for_concrete_model\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si cet attribut vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, le champ sera en mesure de référencer des modèles mandataires. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Cela fait écho au paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">for_concrete_model</span></code> de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentTypeManager.get_for_model\" title=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_for_model()</span></code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"admonition-primary-key-type-compatibility admonition\">\n<p class=\"admonition-title\">Compatibilité de type de clé primaire</p>\n<p>Le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code> n’a pas besoin d’être du même type que les champs de clé primaire des modèles connexes, mais leurs valeurs de clé primaire doivent pouvoir être transformées dans le même type que le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code> par leur méthode <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.get_db_prep_value\" title=\"django.db.models.Field.get_db_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_value()</span></code></a>.</p>\n<p>Par exemple, si vous souhaitez autoriser les relations génériques de modèles avec des champs de clé primaire <a class=\"reference internal\" href=\"/fr/3.0/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> ou <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>, vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> comme type de champ <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code> du modèle puisque les nombres entiers peuvent être forcés vers des chaînes de caractères par <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.get_db_prep_value\" title=\"django.db.models.Field.get_db_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_value()</span></code></a>.</p>\n<p>Pour une flexibilité maximale, vous pouvez utiliser un champ <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TextField</span></code></a> qui n’a pas de longueur maximale définie, mais cela pourrait entraîner des pénalités de performances significatives en fonction du moteur de base de données.</p>\n<p>Il n’y a pas de solution passe-partout concernant le meilleur type de champ. Vous devez évaluer les modèles que vous prévoyez de lier et déterminer quelle solution sera la plus efficace pour votre cas d’utilisation.</p>\n</aside>\n<aside class=\"admonition-serializing-references-to-contenttype-objects admonition\">\n<p class=\"admonition-title\">Sérialisation des références aux objets <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></p>\n<p>Si vous sérialisez des données (par exemple, lors de la génération de <a class=\"reference internal\" href=\"/fr/3.0/topics/testing/tools/#django.test.TransactionTestCase.fixtures\" title=\"django.test.TransactionTestCase.fixtures\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">fixtures</span></code></a>) à partir d’un modèle qui met en œuvre les relations génériques, vous devriez probablement utiliser une clé naturelle pour identifier de manière unique les objets <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> associés. Voir <a class=\"reference internal\" href=\"/fr/3.0/topics/serialization/#topics-serialization-natural-keys\"><span class=\"std std-ref\">clés naturelles</span></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#cmdoption-dumpdata-natural-foreign\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">dumpdata</span> <span class=\"pre\">--natural-foreign</span></code></a> pour plus d’informations.</p>\n</aside>\n<p>Cela activera une API similaire à celle utilisée pour une clé <a class=\"reference internal\" href=\"/fr/3.0/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> normale ; chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</span></code> aura un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">content_object</span></code> qui renvoie l’objet auquel il est lié, et vous pouvez également attribuer une valeur à ce champ ou l’utiliser lors de la création d’un <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</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=\"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\">guido</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;Guido&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">TaggedItem</span><span class=\"p\">(</span><span class=\"n\">content_object</span><span class=\"o\">=</span><span class=\"n\">guido</span><span class=\"p\">,</span> <span class=\"n\">tag</span><span class=\"o\">=</span><span class=\"s1\">&#39;bdfl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">content_object</span>\n<span class=\"go\">&lt;User: Guido&gt;</span>\n</code></pre></div>\n<p>Si l’objet lié est supprimé, les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code> conservent leur valeur originale et le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</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\">guido</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">content_object</span>  <span class=\"c1\"># returns None</span>\n</code></pre></div>\n<p>En raison de la façon dont <a class=\"reference internal\" href=\"#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> est implémentée, vous ne pouvez pas utiliser ces champs directement avec les filtres (<code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code>, par exemple) par l’intermédiaire de l’API de base de données. Comme une clé <a class=\"reference internal\" href=\"#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> n’est pas un objet de champ normal, ces exemples ne fonctionneront <em>pas</em> :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This will fail</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">TaggedItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">content_object</span><span class=\"o\">=</span><span class=\"n\">guido</span><span class=\"p\">)</span>\n<span class=\"c1\"># This will also fail</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">TaggedItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">content_object</span><span class=\"o\">=</span><span class=\"n\">guido</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>De même, les clés <a class=\"reference internal\" href=\"#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> n’apparaissent pas dans les formulaires <a class=\"reference internal\" href=\"/fr/3.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a>.</p>\n<section id=\"reverse-generic-relations\">\n<h3>Relations génériques inverses<a class=\"heading-anchor\" href=\"#reverse-generic-relations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.fields.GenericRelation\">\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\">GenericRelation</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.fields.GenericRelation\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.fields.GenericRelation.related_query_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">related_query_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.fields.GenericRelation.related_query_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La relation de l’objet lié vers cet objet n’existe pas par défaut. En définissant <code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code>, la relation est créée de l’objet lié vers celui-ci. Cela permet d’interroger et de filtrer à partir de l’objet lié.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Si vous savez quels seront les modèles que vous utiliserez le plus souvent, vous pouvez également ajouter une relation générique « inverse » pour activer une API supplémentaire. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.fields</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">GenericRelation</span>\n<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\">Bookmark</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\">url</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">URLField</span><span class=\"p\">()</span>\n    <span class=\"n\">tags</span> <span class=\"o\">=</span> <span class=\"n\">GenericRelation</span><span class=\"p\">(</span><span class=\"n\">TaggedItem</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">Bookmark</span></code> auront chacune un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>, qui peut être utilisé pour récupérer leurs objets <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItems</span></code> associés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Bookmark</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"o\">=</span><span class=\"s1\">&#39;https://www.djangoproject.com/&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t1</span> <span class=\"o\">=</span> <span class=\"n\">TaggedItem</span><span class=\"p\">(</span><span class=\"n\">content_object</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">tag</span><span class=\"o\">=</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t1</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t2</span> <span class=\"o\">=</span> <span class=\"n\">TaggedItem</span><span class=\"p\">(</span><span class=\"n\">content_object</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">tag</span><span class=\"o\">=</span><span class=\"s1\">&#39;python&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">t2</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">tags</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;TaggedItem: django&gt;, &lt;TaggedItem: python&gt;]&gt;</span>\n</code></pre></div>\n<p>En définissant l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code> de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a>, cela permet d’interroger à partir de l’objet lié :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">tags</span> <span class=\"o\">=</span> <span class=\"n\">GenericRelation</span><span class=\"p\">(</span><span class=\"n\">TaggedItem</span><span class=\"p\">,</span> <span class=\"n\">related_query_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;bookmark&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cela permet de filtrer, trier ou d’autres opérations d’interrogation sur <code class=\"docutils literal notranslate\"><span class=\"pre\">Bookmark</span></code> à partir de <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</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=\"c1\"># Get all tags belonging to bookmarks containing `django` in the url</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">TaggedItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">bookmark__url__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;TaggedItem: django&gt;, &lt;TaggedItem: python&gt;]&gt;</span>\n</code></pre></div>\n<p>Bien sûr, si vous n’ajoutez pas la relation inverse <code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code>, vous pouvez faire les mêmes types de recherches manuellement :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">bookmarks</span> <span class=\"o\">=</span> <span class=\"n\">Bookmark</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">url__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">bookmark_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">Bookmark</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">TaggedItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">content_type__pk</span><span class=\"o\">=</span><span class=\"n\">bookmark_type</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"p\">,</span> <span class=\"n\">object_id__in</span><span class=\"o\">=</span><span class=\"n\">bookmarks</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;TaggedItem: django&gt;, &lt;TaggedItem: python&gt;]&gt;</span>\n</code></pre></div>\n<p>Tout comme <a class=\"reference internal\" href=\"#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> accepte les noms des champs type de contenu et identifiant d’object en paramètres, il en va de même pour <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a>; si le modèle qui a la clé étrangère générique n’utilise pas des noms par défaut pour ces champs, vous devez lui passer les noms des champs lors de la création d’une relation <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a>. Par exemple, si le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</span></code> mentionné ci-dessus utilisait des champs nommés <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type_fk</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">object_primary_key</span></code> pour créer sa clé étrangère générique, alors une relation <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a> inverse devrait être définie comme suit :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" 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\">tags</span> <span class=\"o\">=</span> <span class=\"n\">GenericRelation</span><span class=\"p\">(</span>\n    <span class=\"n\">TaggedItem</span><span class=\"p\">,</span>\n    <span class=\"n\">content_type_field</span><span class=\"o\">=</span><span class=\"s1\">&#39;content_type_fk&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">object_id_field</span><span class=\"o\">=</span><span class=\"s1\">&#39;object_primary_key&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Notez également que si vous supprimez un objet qui possède une relation <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a>, tous les objets qui ont une clé <a class=\"reference internal\" href=\"#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> pointant vers lui seront aussi supprimés. Dans l’exemple ci-dessus, cela signifie que si un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Bookmark</span></code> a été supprimé, tous les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">TaggedItem</span></code> pointant dessus seront supprimés en même temps.</p>\n<p>Contrairement à <a class=\"reference internal\" href=\"/fr/3.0/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>, <a class=\"reference internal\" href=\"#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> n’accepte pas de paramètre <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a> pour personnaliser ce comportement ; si vous le souhaitez, vous pouvez éviter la cascade de suppression en évitant de définir une relation <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a> ; un comportement différent peut être fourni par le signal <a class=\"reference internal\" href=\"/fr/3.0/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a>.</p>\n</section>\n<section id=\"generic-relations-and-aggregation\">\n<h3>Relations génériques et agrégation<a class=\"heading-anchor\" href=\"#generic-relations-and-aggregation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L”<a class=\"reference internal\" href=\"/fr/3.0/topics/db/aggregation/\"><span class=\"doc\">API d’agrégation de base de données de Django</span></a> fonctionne avec les relations <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a>. Par exemple, vous pouvez savoir combien de « tags » sont définis pour tous les signets :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" 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\">Bookmark</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s1\">&#39;tags&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;tags__count&#39;: 3}</span>\n</code></pre></div>\n</section>\n<section id=\"generic-relation-in-forms\">\n<span id=\"module-django.contrib.contenttypes.forms\"></span><h3>Relations génériques dans les formulaires<a class=\"heading-anchor\" href=\"#generic-relation-in-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le module <a class=\"reference internal\" href=\"#module-django.contrib.contenttypes.forms\" title=\"django.contrib.contenttypes.forms\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.forms</span></code></a> fournit :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.contrib.contenttypes.forms.BaseGenericInlineFormSet\" title=\"django.contrib.contenttypes.forms.BaseGenericInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseGenericInlineFormSet</span></code></a></p></li>\n<li><p>Une fabrique de groupe de formulaires, <a class=\"reference internal\" href=\"#django.contrib.contenttypes.forms.generic_inlineformset_factory\" title=\"django.contrib.contenttypes.forms.generic_inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">generic_inlineformset_factory()</span></code></a>, pour être utilisée avec <a class=\"reference internal\" href=\"#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<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.forms.BaseGenericInlineFormSet\">\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\">BaseGenericInlineFormSet</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.forms.BaseGenericInlineFormSet\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.forms.generic_inlineformset_factory\">\n<span class=\"sig-name descname\"><span class=\"pre\">generic_inlineformset_factory</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">form</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">ModelForm</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">formset</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">BaseGenericInlineFormSet</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ct_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'content_type'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fk_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'object_id'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">extra</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">3</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">can_order</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">can_delete</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\">max_num</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">formfield_callback</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">validate_max</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">for_concrete_model</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\">min_num</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">validate_min</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.contrib.contenttypes.forms.generic_inlineformset_factory\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericInlineFormSet</span></code> à l’aide de <a class=\"reference internal\" href=\"/fr/3.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a>.</p>\n<p>Vous devez fournir <code class=\"docutils literal notranslate\"><span class=\"pre\">ct_field</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_field</span></code> s’ils sont différents des valeurs par défaut, respectivement <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code>. Les autres paramètres sont similaires à ceux documentés dans <a class=\"reference internal\" href=\"/fr/3.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">inlineformset_factory()</span></code></a>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">for_concrete_model</span></code> correspond au paramètre <a class=\"reference internal\" href=\"#django.contrib.contenttypes.fields.GenericForeignKey.for_concrete_model\" title=\"django.contrib.contenttypes.fields.GenericForeignKey.for_concrete_model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">for_concrete_model</span></code></a>  de <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"generic-relations-in-admin\">\n<span id=\"module-django.contrib.contenttypes.admin\"></span><h3>Relations génériques dans l’interface d’administration<a class=\"heading-anchor\" href=\"#generic-relations-in-admin\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le module <a class=\"reference internal\" href=\"#module-django.contrib.contenttypes.admin\" title=\"django.contrib.contenttypes.admin\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.admin</span></code></a> fournit <a class=\"reference internal\" href=\"#django.contrib.contenttypes.admin.GenericTabularInline\" title=\"django.contrib.contenttypes.admin.GenericTabularInline\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericTabularInline</span></code></a> et <a class=\"reference internal\" href=\"#django.contrib.contenttypes.admin.GenericStackedInline\" title=\"django.contrib.contenttypes.admin.GenericStackedInline\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericStackedInline</span></code></a> (sous-classes de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin\" title=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericInlineModelAdmin</span></code></a>)</p>\n<p>Ces classes et fonctions permettent l’utilisation de relations génériques dans les formulaires et l’interface d’administration. Voir la documentation sur les <a class=\"reference internal\" href=\"/fr/3.0/topics/forms/modelforms/\"><span class=\"doc\">formulaires groupés de modèle</span></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/admin/#using-generic-relations-as-an-inline\"><span class=\"std std-ref\">l’interface d’administration</span></a> pour plus d’informations.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\">\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\">GenericInlineModelAdmin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La classe <a class=\"reference internal\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin\" title=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericInlineModelAdmin</span></code></a> hérite de toutes les propriétés d’une classe <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">InlineModelAdmin</span></code></a>. Cependant, elle en ajoute quelques autres de son cru pour travailler avec la relation générique :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_field\">\n<span class=\"sig-name descname\"><span class=\"pre\">ct_field</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom du champ de clé étrangère <a class=\"reference internal\" href=\"#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a> sur le modèle. Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_fk_field\">\n<span class=\"sig-name descname\"><span class=\"pre\">ct_fk_field</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_fk_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom du champ nombre entier qui représente l’identifiant de l’objet associé. Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">object_id</span></code>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.admin.GenericTabularInline\">\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\">GenericTabularInline</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.admin.GenericTabularInline\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.contenttypes.admin.GenericStackedInline\">\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\">GenericStackedInline</span></span><a class=\"heading-anchor\" href=\"#django.contrib.contenttypes.admin.GenericStackedInline\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les sous-classes de <a class=\"reference internal\" href=\"#django.contrib.contenttypes.admin.GenericInlineModelAdmin\" title=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericInlineModelAdmin</span></code></a> avec mises en page empilées et tabulaires, respectivement.</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"module-django.contrib.contenttypes","toc":[{"title":"Aperçu","anchor":"overview","children":[]},{"title":"Installation du système contenttypes","anchor":"installing-the-contenttypes-framework","children":[]},{"title":"Le modèle ContentType","anchor":"the-contenttype-model","children":[]},{"title":"Méthodes des instances ContentType","anchor":"methods-on-contenttype-instances","children":[{"title":"Le gestionnaire ContentTypeManager","anchor":"the-contenttypemanager","children":[]}]},{"title":"Relations génériques","anchor":"generic-relations","children":[{"title":"Relations génériques inverses","anchor":"reverse-generic-relations","children":[]},{"title":"Relations génériques et agrégation","anchor":"generic-relations-and-aggregation","children":[]},{"title":"Relations génériques dans les formulaires","anchor":"generic-relation-in-forms","children":[]},{"title":"Relations génériques dans l’interface d’administration","anchor":"generic-relations-in-admin","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.0/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/3.0/ref/contrib/"}],"prev":{"docname":"ref/contrib/auth","title":"django.contrib.auth","url":"/fr/3.0/ref/contrib/auth/"},"next":{"docname":"ref/contrib/flatpages","title":"L’application flatpages (pages statiques)","url":"/fr/3.0/ref/contrib/flatpages/"},"formats":{"html":"/fr/3.0/ref/contrib/contenttypes/","markdown":"/fr/3.0/ref/contrib/contenttypes.md","json":"/fr/3.0/ref/contrib/contenttypes.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/contrib/contenttypes.txt","official":"https://docs.djangoproject.com/fr/3.0/ref/contrib/contenttypes/","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"]}