{"title":"Opérations de migration","version":"3.0","locale":"fr","docname":"ref/migration-operations","url":"/fr/3.0/ref/migration-operations/","canonical":"https://djangodocs.dev/fr/3.0/ref/migration-operations/","summary":"Les fichiers de migration sont composés de un ou plusieurs objets Operation qui enregistrent de manière déclarative les opérations à appliquer à la base de données.…","html":"<span id=\"migration-operations\"></span><h1>Opérations de migration<a class=\"heading-anchor\" href=\"#module-django.db.migrations.operations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Les fichiers de migration sont composés de un ou plusieurs objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> qui enregistrent de manière déclarative les opérations à appliquer à la base de données.</p>\n<p>Django utilise également ces objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> pour recomposer un état historisé de vos modèles et pour calculer les modifications effectuées aux modèles depuis la dernière migration afin de pouvoir écrire automatiquement les migrations ; c’est pourquoi ils sont déclaratifs, ce qui permet à Django de facilement tous les charger en mémoire et de les parcourir sans devoir accéder à la base de données pour trouver à quoi le projet devrait ressembler.</p>\n<p>Certains objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> plus spécialisés sont destinés à des opérations comme les <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/#data-migrations\"><span class=\"std std-ref\">migrations de données</span></a> et pour des manipulations manuelles avancées de la base de données. Vous pouvez même écrire vos propres classes <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> si vous le voulez pour englober des modifications que vous effectuez fréquemment.</p>\n<p>Si vous avez besoin d’un fichier de migration vide pour y écrire vos propres objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code>, exécutez <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">makemigrations</span> <span class=\"pre\">--empty</span> <span class=\"pre\">nom_application</span></code>, mais soyez conscient que l’ajout manuel d’opérations modifiant le schéma peut perturber l’autodétecteur de migrations et provoquer du code incorrect durant les prochaines exécutions de <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a>.</p>\n<p>Toutes les opérations Django de base se trouvent dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.migrations.operations</span></code>.</p>\n<p>Pour du contenu d’initiation, consultez le <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/\"><span class=\"doc\">guide thématique des migrations</span></a>.</p>\n<section id=\"schema-operations\">\n<h2>Opérations liées au schéma<a class=\"heading-anchor\" href=\"#schema-operations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"createmodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">CreateModel</span></code><a class=\"heading-anchor\" href=\"#createmodel\"><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.db.migrations.operations.CreateModel\">\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\">CreateModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">options</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\">bases</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\">managers</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.CreateModel\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Crée un nouveau modèle dans l’historique du projet et une table correspondante dans la base de données.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> est le nom du modèle tel qu’il est écrit dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> est une liste de tuples binaires <code class=\"docutils literal notranslate\"><span class=\"pre\">(nom_champ,</span> <span class=\"pre\">instance_champ)</span></code>. L’instance de champ doit être un champ non lié (« unbound ») (donc simplement <code class=\"docutils literal notranslate\"><span class=\"pre\">models.CharField(…)</span></code>, plutôt qu’un champ repris d’un autre modèle).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">options</span></code> est un dictionnaire facultatif de valeurs tirées de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> du modèle.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">bases</span></code> est une liste facultative d’autres classes dont ce modèle doit hériter ; elle peut contenir aussi bien des objets classes que des chaînes au format <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;nomapp.NomModele&quot;</span></code> si vous voulez dépendre d’un autre modèle (vous héritez donc de sa version historique). En cas d’absence, la valeur par défaut hérite du modèle standard <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Model</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">managers</span></code> accepte une liste de tuples binaires <code class=\"docutils literal notranslate\"><span class=\"pre\">(nom_gestionnaire,</span> <span class=\"pre\">instance_gestionnaire)</span></code>. Le premier gestionnaire de la liste sera le gestionnaire par daéfut de ce modèle pour les migrations.</p>\n</section>\n<section id=\"deletemodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">DeleteModel</span></code><a class=\"heading-anchor\" href=\"#deletemodel\"><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.db.migrations.operations.DeleteModel\">\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\">DeleteModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.DeleteModel\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Supprime le modèle de l’historique du projet et ses tables de la base de données.</p>\n</section>\n<section id=\"renamemodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RenameModel</span></code><a class=\"heading-anchor\" href=\"#renamemodel\"><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.db.migrations.operations.RenameModel\">\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\">RenameModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RenameModel\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renomme le modèle d’un ancien nom vers un nouveau nom.</p>\n<p>Il peut arriver que vous deviez ajoutez manuellement cette opération si vous modifiez à la fois le nom du modèle et plusieurs de ses champs ; pour l’autodétecteur, il paraîtra que l’ancien modèle a été supprimé et qu’un nouveau modèle a été ajouté avec un nom différent, ce qui fera que la migration créée perdra toutes les données de l’ancienne table.</p>\n</section>\n<section id=\"altermodeltable\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelTable</span></code><a class=\"heading-anchor\" href=\"#altermodeltable\"><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.db.migrations.operations.AlterModelTable\">\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\">AlterModelTable</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">table</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelTable\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie le nom de la table du modèle (l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a> de la classe interne <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>).</p>\n</section>\n<section id=\"alteruniquetogether\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterUniqueTogether</span></code><a class=\"heading-anchor\" href=\"#alteruniquetogether\"><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.db.migrations.operations.AlterUniqueTogether\">\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\">AlterUniqueTogether</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">unique_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterUniqueTogether\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie l’ensemble de contraintes d’unicité du modèle (l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a> de la classe interne <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>).</p>\n</section>\n<section id=\"alterindextogether\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterIndexTogether</span></code><a class=\"heading-anchor\" href=\"#alterindextogether\"><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.db.migrations.operations.AlterIndexTogether\">\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\">AlterIndexTogether</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterIndexTogether\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie l’ensemble d’index personnalisés du modèle (l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/models/options/#django.db.models.Options.index_together\" title=\"django.db.models.Options.index_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">index_together</span></code></a> de la classe interne <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>).</p>\n</section>\n<section id=\"alterorderwithrespectto\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterOrderWithRespectTo</span></code><a class=\"heading-anchor\" href=\"#alterorderwithrespectto\"><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.db.migrations.operations.AlterOrderWithRespectTo\">\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\">AlterOrderWithRespectTo</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order_with_respect_to</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterOrderWithRespectTo\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Crée ou supprime la colonne <code class=\"docutils literal notranslate\"><span class=\"pre\">_order</span></code> nécessaire à l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/models/options/#django.db.models.Options.order_with_respect_to\" title=\"django.db.models.Options.order_with_respect_to\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code></a> de la classe interne <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>.</p>\n</section>\n<section id=\"altermodeloptions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelOptions</span></code><a class=\"heading-anchor\" href=\"#altermodeloptions\"><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.db.migrations.operations.AlterModelOptions\">\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\">AlterModelOptions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelOptions\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Stocke les modifications de diverses options de modèles (attributs de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> d’un modèle) comme <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code>. N’affecte pas la base de données, mais fait persister ces modifications à l’usage des instances <a class=\"reference internal\" href=\"#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunPython</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">options</span></code> doit être un dictionnaire faisant correspondre des noms d’options à leurs valeurs.</p>\n</section>\n<section id=\"altermodelmanagers\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelManagers</span></code><a class=\"heading-anchor\" href=\"#altermodelmanagers\"><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.db.migrations.operations.AlterModelManagers\">\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\">AlterModelManagers</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">managers</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelManagers\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie les gestionnaires disponibles durant les migrations.</p>\n</section>\n<section id=\"addfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code><a class=\"heading-anchor\" href=\"#addfield\"><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.db.migrations.operations.AddField\">\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\">AddField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">preserve_default</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.db.migrations.operations.AddField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ajoute un champ à un modèle. <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> est le nom du modèle, <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> est le nom du champ et <code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> est une instance de champ <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> non liée (ce que vous placeriez dans une déclaration de champ dans <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>, par exemple <code class=\"docutils literal notranslate\"><span class=\"pre\">models.IntegerField(null=True)</span></code>).</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">preserve_default</span></code> indique si la valeur par défaut du champ est permanente et doit être incluse dans l’état du projet (<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>) ou si elle n’est que temporaire et juste pour la migration (<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>), généralement parce que la migration ajoute un champ non nul à une table et qu’elle a besoin d’une valeur par défaut pour remplir les lignes existantes. Cela ne concerne pas le comportement de définition de valeurs par défaut au sein même de la base de données, car Django ne définit jamais de valeurs par défaut pour la base de données et les applique toujours au niveau du code Django de l’ORM.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Sur les bases de données plus anciennes, l’ajout d’un champ avec valeur par défaut peut provoquer une réécriture complète de la table. Cela arrive même pour des champs avec valeur nulle autorisée et peut affecter les performances en baisse. Pour éviter cela, il s’agit de suivre les étapes suivantes.</p>\n<ul class=\"simple\">\n<li><p>Ajoutez le champ avec valeur nulle autorisée sans valeur par défaut et lancez la commande <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a>. Cela devrait générer une migration contenant une opération <code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code>.</p></li>\n<li><p>Ajoutez la valeur par défaut à votre champ et lancez la commande <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a>. Cela devrait générer une migration contenant une opération <code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code>.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"removefield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveField</span></code><a class=\"heading-anchor\" href=\"#removefield\"><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.db.migrations.operations.RemoveField\">\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\">RemoveField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Supprime un champ d’un modèle.</p>\n<p>Gardez en tête que lors de l’inversion de l’opération, un nouveau champ est ajouté au modèle. L’opération est réversible (sans prendre en compte la perte de données qui est évidemment irréversible) à la condition que le champ puisse valoir <code class=\"docutils literal notranslate\"><span class=\"pre\">null</span></code> ou qu’il possède une valeur par défaut utilisable pour remplir la colonne recréée. Dans le cas contraire, l’opération est irréversible.</p>\n</section>\n<section id=\"alterfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code><a class=\"heading-anchor\" href=\"#alterfield\"><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.db.migrations.operations.AlterField\">\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\">AlterField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">preserve_default</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.db.migrations.operations.AlterField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie la définition d’un champ, y compris les modifications de son type, des attributs <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> ou des autres attributs de champ.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">preserve_default</span></code> indique si la valeur par défaut du champ est permanente et doit être incluse dans l’état du projet (<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>) ou si elle n’est que temporaire et juste pour la migration (<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>), généralement parce que la migration modifie un champ nul vers un champ non nul à une table et qu’elle a besoin d’une valeur par défaut pour remplir les lignes existantes. Cela ne concerne pas le comportement de définition de valeurs par défaut au sein même de la base de données, car Django ne définit jamais de valeurs par défaut pour la base de données et les applique toujours au niveau du code Django de l’ORM.</p>\n<p>Notez qu’il n’est pas toujours possible d’effectuer toutes les modifications, aussi en fonction de la base de données. Par exemple, il n’est pas possible de transformer un champ de type texte comme <code class=\"docutils literal notranslate\"><span class=\"pre\">models.TextField()</span></code> en un champ de type numérique comme <code class=\"docutils literal notranslate\"><span class=\"pre\">models.IntegerField()</span></code> dans la plupart des bases de données.</p>\n</section>\n<section id=\"renamefield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RenameField</span></code><a class=\"heading-anchor\" href=\"#renamefield\"><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.db.migrations.operations.RenameField\">\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\">RenameField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RenameField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Modifie le nom d’un champ (et, si <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> n’est pas défini, le nom de la colonne).</p>\n</section>\n<section id=\"addindex\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddIndex</span></code><a class=\"heading-anchor\" href=\"#addindex\"><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.db.migrations.operations.AddIndex\">\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\">AddIndex</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AddIndex\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Crée un index dans la table de base de données pour le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> est une instance de la classe <a class=\"reference internal\" href=\"/fr/3.0/ref/models/indexes/#django.db.models.Index\" title=\"django.db.models.Index\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Index</span></code></a>.</p>\n</section>\n<section id=\"removeindex\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveIndex</span></code><a class=\"heading-anchor\" href=\"#removeindex\"><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.db.migrations.operations.RemoveIndex\">\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\">RemoveIndex</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveIndex\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Supprime l’index nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> du modèle ayant le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code>.</p>\n</section>\n<section id=\"addconstraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddConstraint</span></code><a class=\"heading-anchor\" href=\"#addconstraint\"><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.db.migrations.operations.AddConstraint\">\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\">AddConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">constraint</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AddConstraint\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"2.2\">\n<p class=\"version-note-title\">New in Django 2.2</p></aside>\n<p>Crée une :doc:` contrainte &lt;/ref/models/constraints&gt;` dans la table de base de données pour le modèle nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code>.</p>\n</section>\n<section id=\"removeconstraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveConstraint</span></code><a class=\"heading-anchor\" href=\"#removeconstraint\"><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.db.migrations.operations.RemoveConstraint\">\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\">RemoveConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveConstraint\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"2.2\">\n<p class=\"version-note-title\">New in Django 2.2</p></aside>\n<p>Supprime la contrainte nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> du modèle ayant le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code>.</p>\n</section>\n</section>\n<section id=\"special-operations\">\n<h2>Opérations spéciales<a class=\"heading-anchor\" href=\"#special-operations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"runsql\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code><a class=\"heading-anchor\" href=\"#runsql\"><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.db.migrations.operations.RunSQL\">\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\">RunSQL</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sql</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse_sql</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\">state_operations</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\">hints</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\">elidable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunSQL\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Permet d’exécuter du code SQL arbitraire dans la base de données, pratique pour des fonctionnalités plus avancées des moteurs de base de données que Django ne prend pas directement en charge.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code>, et <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> s’il est fourni, doivent être des chaîne de SQL à exécuter dans la base de données. Pour la plupart des moteurs de base de données (tous sauf PostgreSQL), Django sépare le code SQL en instructions individuelles avant de les exécuter.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Avec PostgreSQL et SQLite, n’utilisez des instructions SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">BEGIN</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">COMMIT</span></code> que dans des <a class=\"reference internal\" href=\"/fr/3.0/howto/writing-migrations/#non-atomic-migrations\"><span class=\"std std-ref\">migrations non atomiques</span></a>, afin d’éviter de casser l’état de transaction de Django.</p>\n</aside>\n<p>Vous pouvez aussi transmettre une liste de chaînes ou de tuples binaires. Cette dernière option est utilisée pour transmettre des requêtes et des paramètres sur le même principe que pour <a class=\"reference internal\" href=\"/fr/3.0/topics/db/sql/#executing-custom-sql\"><span class=\"std std-ref\">cursor.execute()</span></a>. Ces trois opérations sont équivalentes :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (&#39;Reinhardt&#39;);&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">([(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (&#39;Reinhardt&#39;);&quot;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)])</span>\n<span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">([(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (</span><span class=\"si\">%s</span><span class=\"s2\">);&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s1\">&#39;Reinhardt&#39;</span><span class=\"p\">])])</span>\n</code></pre></div>\n<p>Si vous voulez inclure des signes « pour cent » littéraux dans la requête, vous devez les doubler si vous transmettez des paramètres.</p>\n<p>Les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> sont exécutées lorsque la migration est défaite. Elles sont censé défaire ce que font les requêtes <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code>. Par exemple, pour annuler l’insertion ci-dessus par une suppression :</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\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span>\n    <span class=\"n\">sql</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (</span><span class=\"si\">%s</span><span class=\"s2\">);&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s1\">&#39;Reinhardt&#39;</span><span class=\"p\">])],</span>\n    <span class=\"n\">reverse_sql</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s2\">&quot;DELETE FROM musician where name=</span><span class=\"si\">%s</span><span class=\"s2\">;&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s1\">&#39;Reinhardt&#39;</span><span class=\"p\">])],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (par défaut), l’opération <code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code> est irréversible.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> permet de fournir des opérations qui sont équivalentes au code SQL en terme d’état du projet. Par exemple, si vous créez une colonne manuellement, vous devriez passer une liste contenant une opération <code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code> afin que l’autodétecteur puisse maintenir un état à jour du modèle. Sinon, au prochain lancement de <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code>, il ne verra aucune opération ajoutant ce champ et va donc essayer de le recréer une nouvelle fois. 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=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;ALTER TABLE musician ADD COLUMN name varchar(255) NOT NULL;&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">state_operations</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">AddField</span><span class=\"p\">(</span>\n            <span class=\"s1\">&#39;musician&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">),</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> sera transmis comme <code class=\"docutils literal notranslate\"><span class=\"pre\">**hints</span></code> à la méthode <a class=\"reference internal\" href=\"/fr/3.0/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code></a> des routeurs de base de données afin de les aider à prendre les décisions de routage. Voir <a class=\"reference internal\" href=\"/fr/3.0/topics/db/multi-db/#topics-db-multi-db-hints\"><span class=\"std std-ref\">Indications (hints)</span></a> pour plus de détails sur les indications de base de données.</p>\n<p>Le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">elidable</span></code> détermine si l’opération sera supprimée (éludée) lors de la <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/#migration-squashing\"><span class=\"std std-ref\">fusion des migrations</span></a>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunSQL.noop\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">RunSQL.</span></span><span class=\"sig-name descname\"><span class=\"pre\">noop</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunSQL.noop\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Transmettez l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL.noop</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> lorsque vous voulez que l’opération ne fasse rien dans une direction donnée. C’est particulièrement utile pour rendre une opération réversible.</p>\n</dd></dl>\n\n</section>\n<section id=\"runpython\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code><a class=\"heading-anchor\" href=\"#runpython\"><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.db.migrations.operations.RunPython\">\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\">RunPython</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">code</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse_code</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\">atomic</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\">hints</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\">elidable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunPython\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Exécute du code Python personnalisé dans un contexte historisé. <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> (et <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> s’il est renseigné) doivent être des objets exécutables acceptant deux paramètres ; le premier est une instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.apps.registry.Apps</span></code> contenant les modèles historisés qui correspondent à la position de l’opération dans l’historique du projet et la seconde une instance de <a class=\"reference internal\" href=\"/fr/3.0/ref/schema-editor/#django.db.backends.base.schema.BaseDatabaseSchemaEditor\" title=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code></a>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> est appelé lors de l’inversion des migrations. Cet objet exécutable doit défaire ce qui a été fait par l’objet exécutable <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> afin que cette migration soit réversible. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (par défaut), l’opération <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> est irréversible.</p>\n<p>Le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> sera transmis comme <code class=\"docutils literal notranslate\"><span class=\"pre\">**hints</span></code> à la méthode <a class=\"reference internal\" href=\"/fr/3.0/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code></a> des routeurs de base de données afin de les aider à prendre une décision de routage. Voir <a class=\"reference internal\" href=\"/fr/3.0/topics/db/multi-db/#topics-db-multi-db-hints\"><span class=\"std std-ref\">Indications (hints)</span></a> pour plus de détails sur les indications de base de données.</p>\n<p>Le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">elidable</span></code> détermine si l’opération sera supprimée (éludée) lors de la <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/#migration-squashing\"><span class=\"std std-ref\">fusion des migrations</span></a>.</p>\n<p>Il est conseillé d’écrire le code sous forme de fonction distincte au-dessus de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Migration</span></code> dans le fichier de migration et de transmettre celle-ci à <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code>. Voici un exemple d’emploi de <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> pour créer quelques objets initiaux d’un modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Country</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=\"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\">migrations</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">forwards_func</span><span class=\"p\">(</span><span class=\"n\">apps</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We get the model from the versioned app registry;</span>\n    <span class=\"c1\"># if we directly import it, it&#39;ll be the wrong version</span>\n    <span class=\"n\">Country</span> <span class=\"o\">=</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Country&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">db_alias</span> <span class=\"o\">=</span> <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">alias</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">([</span>\n        <span class=\"n\">Country</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;USA&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;us&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">Country</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;France&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">])</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">reverse_func</span><span class=\"p\">(</span><span class=\"n\">apps</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">):</span>\n    <span class=\"c1\"># forwards_func() creates two Country instances,</span>\n    <span class=\"c1\"># so reverse_func() should delete them.</span>\n    <span class=\"n\">Country</span> <span class=\"o\">=</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Country&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">db_alias</span> <span class=\"o\">=</span> <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">alias</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;USA&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;us&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;France&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Migration</span><span class=\"p\">(</span><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">Migration</span><span class=\"p\">):</span>\n\n    <span class=\"n\">dependencies</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"n\">operations</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunPython</span><span class=\"p\">(</span><span class=\"n\">forwards_func</span><span class=\"p\">,</span> <span class=\"n\">reverse_func</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>Il s’agit généralement de l’opération que l’on utilise pour créer des <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/#data-migrations\"><span class=\"std std-ref\">migrations de données</span></a>, pour lancer des mises à jour et modifications de données personnalisées ou pour toute autre opération qui nécessite le recours à l’ORM ou à du code Python.</p>\n<p>Tout comme pour <a class=\"reference internal\" href=\"#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a>, si vous faites ici des modifications au schéma, prenez soin de le faire en dehors de la portée du systèmes des modèles Django (par ex. avec des déclencheurs) ou utilisez <a class=\"reference internal\" href=\"#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code></a> pour insérer des opérations qui reflètent vos modifications sur l’état des modèles. Sinon, l’ORM versionné et l’autodétecteur risquent de ne plus fonctionner correctement.</p>\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> va exécuter son contenu à l’intérieur d’une transaction pour les bases de données qui ne prennent pas en charge les transactions DDL (instructions de modification du schéma), par exemple MySQL ou Oracle. Cela se passe en principe bien, mais pourrait provoquer un plantage si vous essayez d’utiliser l’objet  <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor</span></code> fournit par ces moteurs ; dans ce cas, passez <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic=False</span></code> à l’opération <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code>.</p>\n<p>Pour les bases de données qui prennent en charge les transactions de schéma DDL (SQLite et PostgreSQL), aucune transaction n’est automatiquement rajoutée pour les opérations <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> en dehors des transactions créées pour chaque migration. Ainsi, par exemple avec PostgreSQL, vous devriez éviter de combiner des modifications de schéma avec des opérations <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> dans la même migration, au risque de recevoir des erreurs du genre <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">cannot</span> <span class=\"pre\">ALTER</span> <span class=\"pre\">TABLE</span> <span class=\"pre\">&quot;mytable&quot;</span> <span class=\"pre\">because</span> <span class=\"pre\">it</span> <span class=\"pre\">has</span> <span class=\"pre\">pending</span> <span class=\"pre\">trigger</span> <span class=\"pre\">events</span></code>.</p>\n<p>Si votre base de données est différente et que vous n’êtes pas sûr si elle prend en charge les transactions DDL, consultez l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.features.can_rollback_ddl</span></code>.</p>\n<p>Si l’opération <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> fait partie d’une <a class=\"reference internal\" href=\"/fr/3.0/howto/writing-migrations/#non-atomic-migrations\"><span class=\"std std-ref\">migration non atomique</span></a>, l’opération ne sera exécutée dans une transaction que si <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic=True</span></code> est transmis à l’opération <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> ne modifie pas de façon magique la connexion des modèles à votre place ; toute méthode de modèle que vous appelez sera dirigée vers la base de données par défaut, sauf si vous leur indiquez l’alias de base de données à utiliser (disponible dans <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor.connection.alias</span></code>, où <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor</span></code> est le second paramètre reçu par votre fonction).</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunPython.noop\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">static</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">RunPython.</span></span><span class=\"sig-name descname\"><span class=\"pre\">noop</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunPython.noop\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Transmettez la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL.noop</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> lorsque vous voulez que l’opération ne fasse rien dans une direction donnée. C’est particulièrement utile pour rendre une opération réversible.</p>\n</dd></dl>\n\n</section>\n<section id=\"separatedatabaseandstate\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code><a class=\"heading-anchor\" href=\"#separatedatabaseandstate\"><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.db.migrations.operations.SeparateDatabaseAndState\">\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\">SeparateDatabaseAndState</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">database_operations</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\">state_operations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.SeparateDatabaseAndState\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Une opération hautement spécialisée qui permet de mélanger des opérations touchant aux aspects de modification de schéma de base de données avec des opérations de changement d’état (en lien avec l’autodétecteur).</p>\n<p>Elle accepte deux listes d’opérations. Quand on lui demande d’appliquer les changements d’état, elle utilise la liste <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> (il s’agit d’une version généralisée du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> de <a class=\"reference internal\" href=\"#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a>). Quand on lui demande d’appliquer les modifications de base de données, elle utilise la liste <code class=\"docutils literal notranslate\"><span class=\"pre\">database_operations</span></code>.</p>\n<p>Si l’état actuel de la base de données et la vue de cet état par Django diffèrent, ceci peut casser le système des migrations, voire même aboutir à des pertes de données. Il vaut la peine de faire bien attention et de contrôler attentivement les opérations de base de données et d’état. Vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlmigrate</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-dbshell\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dbshell</span></code></a> pour vérifier les opérations de base de données. Vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a>, particulièrement avec l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#cmdoption-makemigrations-dry-run\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--dry-run</span></code></a>, pour vérifier les opérations d’état.</p>\n<p>Pour voir un exemple qui utilise <code class=\"docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code>, consultez <a class=\"reference internal\" href=\"/fr/3.0/howto/writing-migrations/#changing-a-manytomanyfield-to-use-a-through-model\"><span class=\"std std-ref\">Modification d’un champ ManyToManyField pour utiliser un modèle intermédiaire</span></a>.</p>\n</section>\n</section>\n<section id=\"writing-your-own\">\n<span id=\"writing-your-own-migration-operation\"></span><h2>Écriture d’opérations personnalisées<a class=\"heading-anchor\" href=\"#writing-your-own\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les opérations possèdent une API relativement simple et sont conçues pour pouvoir facilement écrire des sous-classes pour compléter celles que Django fournit. La structure de base d’une <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> ressemble à ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.migrations.operations.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Operation</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyCustomOperation</span><span class=\"p\">(</span><span class=\"n\">Operation</span><span class=\"p\">):</span>\n\n    <span class=\"c1\"># If this is False, it means that this operation will be ignored by</span>\n    <span class=\"c1\"># sqlmigrate; if true, it will be run and the SQL collected for its output.</span>\n    <span class=\"n\">reduces_to_sql</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    <span class=\"c1\"># If this is False, Django will refuse to reverse past this operation.</span>\n    <span class=\"n\">reversible</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">arg1</span><span class=\"p\">,</span> <span class=\"n\">arg2</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Operations are usually instantiated with arguments in migration</span>\n        <span class=\"c1\"># files. Store the values of them on self for later use.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">state_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The Operation should take the &#39;state&#39; parameter (an instance of</span>\n        <span class=\"c1\"># django.db.migrations.state.ProjectState) and mutate it to match</span>\n        <span class=\"c1\"># any schema changes that have occurred.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The Operation should use schema_editor to apply any changes it</span>\n        <span class=\"c1\"># wants to make to the database.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_backwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># If reversible is True, this is called when the operation is reversed.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">describe</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># This is used to describe what the operation does in console output.</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Custom Operation&quot;</span>\n</code></pre></div>\n<p>Vous pouvez prendre ce modèle et l’étendre, même si nous suggérons d’examiner les opérations fournies par Django dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.migrations.operations</span></code>. Elles couvrent une grande partie des exemples d’utilisation des aspects semi-internes du système des migrations, tels que <code class=\"docutils literal notranslate\"><span class=\"pre\">ProjectState</span></code> ainsi que les mécanismes utilisés pour obtenir les modèles historisés, tout comme <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState</span></code> et les motifs utilisés pour faire évoluer les modèles historisés dans <code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards()</span></code>.</p>\n<p>Quelques éléments à signaler :</p>\n<ul>\n<li><p>Vous n’avez pas besoin d’en apprendre beaucoup sur <code class=\"docutils literal notranslate\"><span class=\"pre\">ProjectState</span></code> pour écrire des migrations ; il suffit de savoir qu’il possède une propriété <code class=\"docutils literal notranslate\"><span class=\"pre\">apps</span></code> qui donne accès à un registre d’applications (sur lequel vous pouvez appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">get_model</span></code>).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">database_forwards</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">database_backwards</span></code> reçoivent tous deux deux états ; ils représentent la différence par rapport à ce que la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards</span></code> aurait appliqué, mais vous sont transmis par commodité et pour des raisons de vitesse.</p></li>\n<li><p>Si vous souhaitez manipuler des classes ou instances de modèles à partir du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">from_state</span></code> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">database_forwards()</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">database_backwards()</span></code>, il faut produire les états de modèles en utilisant la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">clear_delayed_apps_cache()</span></code> afin de rendre disponible les modèles liés :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This operation should have access to all models. Ensure that all models are</span>\n    <span class=\"c1\"># reloaded in case any are delayed.</span>\n    <span class=\"n\">from_state</span><span class=\"o\">.</span><span class=\"n\">clear_delayed_apps_cache</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">to_state</span></code> dans la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">database_backwards</span></code> est l’état <em>plus ancien</em> ; c’est-à-dire celui qui représentera l’état actuel au moment où la migration aura terminé son travail d’annulation.</p></li>\n<li><p>Vous pouvez trouver des implémentations de <code class=\"docutils literal notranslate\"><span class=\"pre\">references_model</span></code> dans les opérations fournies par Django ; cela fait partie du code d’autodétection et ne joue pas de rôle pour les opérations personnalisées.</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Pour des raisons de performance, les instances <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.fields</span></code> sont réutilisées d’une migration à l’autre. Vous ne devez jamais toucher aux attributs de ces instances. Si vous avez besoin de faire évoluer un champ dans <code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards()</span></code>, vous devez enlever l’ancienne instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.fields</span></code> et ajouter une nouvelle instance à sa place. Le même principe vaut pour les instances <a class=\"reference internal\" href=\"/fr/3.0/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.managers</span></code>.</p>\n</aside>\n<p>Comme exemple, créons une opération qui charge des extensions PostgreSQL (qui contiennent certaines des fonctionnalités les plus enthousiasmantes de PostgreSQL. Comme il n’y a pas de changement d’état de modèle, tout ce qu’elle fait, c’est d’exécuter une commande :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.migrations.operations.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Operation</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LoadExtension</span><span class=\"p\">(</span><span class=\"n\">Operation</span><span class=\"p\">):</span>\n\n    <span class=\"n\">reversible</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">state_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">):</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;CREATE EXTENSION IF NOT EXISTS </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_backwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;DROP EXTENSION </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">describe</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Creates extension </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n</code></pre></div>\n</section>","rootId":"module-django.db.migrations.operations","toc":[{"title":"Opérations liées au schéma","anchor":"schema-operations","children":[{"title":"CreateModel","anchor":"createmodel","children":[]},{"title":"DeleteModel","anchor":"deletemodel","children":[]},{"title":"RenameModel","anchor":"renamemodel","children":[]},{"title":"AlterModelTable","anchor":"altermodeltable","children":[]},{"title":"AlterUniqueTogether","anchor":"alteruniquetogether","children":[]},{"title":"AlterIndexTogether","anchor":"alterindextogether","children":[]},{"title":"AlterOrderWithRespectTo","anchor":"alterorderwithrespectto","children":[]},{"title":"AlterModelOptions","anchor":"altermodeloptions","children":[]},{"title":"AlterModelManagers","anchor":"altermodelmanagers","children":[]},{"title":"AddField","anchor":"addfield","children":[]},{"title":"RemoveField","anchor":"removefield","children":[]},{"title":"AlterField","anchor":"alterfield","children":[]},{"title":"RenameField","anchor":"renamefield","children":[]},{"title":"AddIndex","anchor":"addindex","children":[]},{"title":"RemoveIndex","anchor":"removeindex","children":[]},{"title":"AddConstraint","anchor":"addconstraint","children":[]},{"title":"RemoveConstraint","anchor":"removeconstraint","children":[]}]},{"title":"Opérations spéciales","anchor":"special-operations","children":[{"title":"RunSQL","anchor":"runsql","children":[]},{"title":"RunPython","anchor":"runpython","children":[]},{"title":"SeparateDatabaseAndState","anchor":"separatedatabaseandstate","children":[]}]},{"title":"Écriture d’opérations personnalisées","anchor":"writing-your-own","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.0/ref/"}],"prev":{"docname":"ref/middleware","title":"Intergiciels (« middleware »)","url":"/fr/3.0/ref/middleware/"},"next":{"docname":"ref/models/index","title":"Modèles","url":"/fr/3.0/ref/models/"},"formats":{"html":"/fr/3.0/ref/migration-operations/","markdown":"/fr/3.0/ref/migration-operations.md","json":"/fr/3.0/ref/migration-operations.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/migration-operations.txt","official":"https://docs.djangoproject.com/fr/3.0/ref/migration-operations/","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"]}