{"title":"Instantanés","version":"5.1","locale":"fr","docname":"topics/db/fixtures","url":"/fr/5.1/topics/db/fixtures/","canonical":"https://djangodocs.dev/fr/5.1/topics/db/fixtures/","summary":"Un instantané est un ensemble de fichiers contenant du contenu sérialisé de base de données. Chaque instantané possède un nom unique et les fichiers composant…","html":"<span id=\"fixtures-explanation\"></span><h1>Instantanés<a class=\"heading-anchor\" href=\"#fixtures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Un <em>instantané</em> est un ensemble de fichiers contenant du contenu sérialisé de base de données. Chaque instantané possède un nom unique et les fichiers composant l’instantané peuvent être distribués dans plusieurs répertoires et plusieurs applications.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/5.1/howto/initial-data/\"><span class=\"doc\">Données initiales pour les modèles</span></a></p></li>\n</ul>\n</aside>\n<section id=\"how-to-produce-a-fixture\">\n<h2>Comment produire un instantané<a class=\"heading-anchor\" href=\"#how-to-produce-a-fixture\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les instantanés peuvent être générés par la commande  <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">dumpdata</span></code></a>. Il est aussi possible de produire des instantanés personnalisés en utilisant directement  les <a class=\"reference internal\" href=\"/fr/5.1/topics/serialization/\"><span class=\"doc\">outils de sérialisation</span></a> ou même en les écrivant à la main.</p>\n</section>\n<section id=\"how-to-use-a-fixture\">\n<h2>Comment utiliser un instantané<a class=\"heading-anchor\" href=\"#how-to-use-a-fixture\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les instantanés peuvent être utilisés pour préremplir la base de données avec des données pour les <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#topics-testing-fixtures\"><span class=\"std std-ref\">tests</span></a>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"n\">fixtures</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;fixture-label&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>ou pour fournir des <a class=\"reference internal\" href=\"/fr/5.1/howto/initial-data/#initial-data-via-fixtures\"><span class=\"std std-ref\">données initiales</span></a> en utilisant la commande <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">loaddata</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>&lt;fixture<span class=\"w\"> </span>label&gt;\n</code></pre></div>\n</section>\n<section id=\"how-fixtures-are-discovered\">\n<h2>Découvrabilité des instantanés<a class=\"heading-anchor\" href=\"#how-fixtures-are-discovered\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django recherche les instantanés à ces emplacements :</p>\n<ol class=\"arabic simple\">\n<li><p>Dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">fixtures</span></code> de chaque application installée</p></li>\n<li><p>Dans tout répertoire mentionné dans le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-FIXTURE_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FIXTURE_DIRS</span></code></a></p></li>\n<li><p>Dans le chemin explicitement contenu dans le nom de l’instantané</p></li>\n</ol>\n<p>Django va charger tous les instantanés qu’il trouve aux emplacements indiqués par les noms d’instantanés. Si un nom d’instantané indiqué possède une extension de fichier, seuls des instantanés de ce type seront chargés. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>mydata.json\n</code></pre></div>\n<p>ne charge que les instantanés JSON nommés <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata</span></code>. L’extension d’instantané doit correspondre au nom enregistré d’un <a class=\"reference internal\" href=\"/fr/5.1/topics/serialization/#serialization-formats\"><span class=\"std std-ref\">sérialiseur</span></a> (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">json</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">xml</span></code>).</p>\n<p>Si vous omettez l’extension, Django recherche tous les types d’instantané disponibles pour chaque instantané trouvé. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>mydata\n</code></pre></div>\n<p>recherche tout instantané ou type d’instantané nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata</span></code>. Si un répertoire d’instantané contient <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json</span></code>, cet instantané serait chargé comme instantané JSON.</p>\n<p>Les noms d’instantanés peuvent contenir une partie « chemin ». Ces répertoires sont alors inclus dans le chemin de recherche. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>foo/bar/mydata.json\n</code></pre></div>\n<p>recherche <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;étiquette_app&gt;/fixtures/foo/bar/mydata.json</span></code> pour chaque application installée, <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;nom_rép&gt;/foo/bar/mydata.json</span></code> pour chaque répertoire dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-FIXTURE_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FIXTURE_DIRS</span></code></a> ainsi que le chemin littéral <code class=\"docutils literal notranslate\"><span class=\"pre\">foo/bar/mydata.json</span></code>.</p>\n<section id=\"fixtures-loading-order\">\n<h3>Ordre de chargement des instantanés<a class=\"heading-anchor\" href=\"#fixtures-loading-order\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Plusieurs instantanés peuvent être indiqués dans la même invocation. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>mammals<span class=\"w\"> </span>birds<span class=\"w\"> </span>insects\n</code></pre></div>\n<p>ou dans une classe de cas de tests :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AnimalTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"n\">fixtures</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;mammals&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birds&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;insects&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>L’ordre dans lequel sont chargés les instantanés suit l’ordre dans lequel ils sont indiqués, que ce soit lors de l’utilisation de la commande d’administration ou quand ils sont mentionnés dans une classe de cas de tests comme démontré plus haut.</p>\n<p>Dans ces exemples, tous les instantanés nommés <code class=\"docutils literal notranslate\"><span class=\"pre\">mammals</span></code> dans toutes les applications (dans l’ordre d’apparition des applications dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>) seront chargés en premier. Puis, tous les instantanés <code class=\"docutils literal notranslate\"><span class=\"pre\">birds</span></code> seront chargés, suivis par tous les instantanés <code class=\"docutils literal notranslate\"><span class=\"pre\">insects</span></code>.</p>\n<p>Sachez que si le moteur de base de données gère les contraintes de lignes, celles-ci seront vérifiées à la fin de la transaction. Toute relation traversant les instantanés peut aboutir à une erreur de chargement si la configuration de base de données ne prend pas en charge le contrôle différé des contraintes (référez-vous à la documentation de <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/constraint-foreign-key.html\">MySQL</a> pour un exemple).</p>\n</section>\n</section>\n<section id=\"how-fixtures-are-saved-to-the-database\">\n<h2>Comment les instantanés sont enregistrés en base de données<a class=\"heading-anchor\" href=\"#how-fixtures-are-saved-to-the-database\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque des fichiers d’instantanés sont traités, les données sont enregistrées telles quelles dans la base de données. Les méthodes <a class=\"reference internal\" href=\"/fr/5.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> définies dans les modèles ne sont pas appelées et les éventuels signaux <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> ou <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> sont appelés avec <code class=\"docutils literal notranslate\"><span class=\"pre\">raw=True</span></code> car l’instance ne contient que les attributs locaux du modèle. Il est par exemple imaginable de désactiver les gestionnaires accédant aux champs liés absents lors du chargement des instantanés, car une exception serait générée dans le cas contraire :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">post_save</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyModel</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_handler</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"c1\"># disable the handler during fixture loading</span>\n    <span class=\"k\">if</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;raw&quot;</span><span class=\"p\">]:</span>\n        <span class=\"k\">return</span>\n    <span class=\"o\">...</span>\n\n\n<span class=\"n\">post_save</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">my_handler</span><span class=\"p\">,</span> <span class=\"n\">sender</span><span class=\"o\">=</span><span class=\"n\">MyModel</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>On pourrait aussi écrire un décorateur pour encapsuler cette logique :</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\">functools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">wraps</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">disable_for_loaddata</span><span class=\"p\">(</span><span class=\"n\">signal_handler</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Decorator that turns off signal handlers when loading fixture data.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nd\">@wraps</span><span class=\"p\">(</span><span class=\"n\">signal_handler</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">wrapper</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;raw&quot;</span><span class=\"p\">]:</span>\n            <span class=\"k\">return</span>\n        <span class=\"n\">signal_handler</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrapper</span>\n\n\n<span class=\"nd\">@disable_for_loaddata</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_handler</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Il faut cependant être conscient que cette logique désactivera les signaux lors de chaque désérialisation des instantanés, pas seulement durant <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">loaddata</span></code></a>.</p>\n</section>\n<section id=\"compressed-fixtures\">\n<h2>Instantanés compressés<a class=\"heading-anchor\" href=\"#compressed-fixtures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les instantanés peuvent être compressés dans les formats <code class=\"docutils literal notranslate\"><span class=\"pre\">zip</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">gz</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">bz2</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">lzma</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">xz</span></code>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>django-admin<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>mydata.json\n</code></pre></div>\n<p>recherche l’un des fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json.zip</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json.gz</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json.bz2</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json.lzma</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json.xz</span></code>. Le premier fichier contenu dans une archive compressée est utilisé.</p>\n<p>Notez que si deux instantanés de même nom mais de type différent sont trouvés (par exemple si <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.json</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">mydata.xml.gz</span></code> sont trouvés dans le même répertoire d’instantanés), l’installation des instantanés est interrompue et toute donnée déjà installée par l’appel à <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">loaddata</span></code></a> est retirée de la base de données.</p>\n<aside class=\"admonition-mysql-with-myisam-and-fixtures admonition\">\n<p class=\"admonition-title\">MySQL avec MyISAM et les instantanés</p>\n<p>Le moteur de stockage MyISAM de MySQL ne gère ni les transactions, ni les contraintes. Si vous utilisez ce moteur, les données d’instantanés ne sont pas validées et d’éventuelles données déjà chargées en base de données ne sont pas effacées dans le cas où des fichiers d’instantanés conflictuels sont trouvés.</p>\n</aside>\n</section>\n<section id=\"database-specific-fixtures\">\n<h2>Instantanés spécifiques à certaines bases de données<a class=\"heading-anchor\" href=\"#database-specific-fixtures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous vous trouvez dans une configuration avec plusieurs bases de données, il se pourrait que vous vouliez charger certains instantanés dans une base de données mais pas dans l’autre. Dans cette situation, vous pouvez insérer des identifiants de base de données dans les noms des instantanés.</p>\n<p>Par exemple, si votre réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> contient une base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">users</span></code>, nommez l’instantané <code class=\"docutils literal notranslate\"><span class=\"pre\">mesdonnees.users.json</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">mesdonnees.users.json.gz</span></code> et cet instantané ne sera chargé que lorsque vous indiquez que vous souhaitez charger des données dans la base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">users</span></code>.</p>\n</section>","rootId":"fixtures","toc":[{"title":"Comment produire un instantané","anchor":"how-to-produce-a-fixture","children":[]},{"title":"Comment utiliser un instantané","anchor":"how-to-use-a-fixture","children":[]},{"title":"Découvrabilité des instantanés","anchor":"how-fixtures-are-discovered","children":[{"title":"Ordre de chargement des instantanés","anchor":"fixtures-loading-order","children":[]}]},{"title":"Comment les instantanés sont enregistrés en base de données","anchor":"how-fixtures-are-saved-to-the-database","children":[]},{"title":"Instantanés compressés","anchor":"compressed-fixtures","children":[]},{"title":"Instantanés spécifiques à certaines bases de données","anchor":"database-specific-fixtures","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/5.1/topics/"},{"docname":"topics/db/index","title":"Modèles et bases de données","url":"/fr/5.1/topics/db/"}],"prev":{"docname":"topics/db/instrumentation","title":"Instrumentation de base de données","url":"/fr/5.1/topics/db/instrumentation/"},"next":{"docname":"topics/db/examples/index","title":"Exemples d’utilisation de l’API de relations entre modèles","url":"/fr/5.1/topics/db/examples/"},"formats":{"html":"/fr/5.1/topics/db/fixtures/","markdown":"/fr/5.1/topics/db/fixtures.md","json":"/fr/5.1/topics/db/fixtures.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/topics/db/fixtures.txt","official":"https://docs.djangoproject.com/fr/5.1/topics/db/fixtures/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}