{"title":"Migreringar","version":"5.2","locale":"sv","docname":"topics/migrations","url":"/sv/5.2/topics/migrations/","canonical":"https://djangodocs.dev/sv/5.2/topics/migrations/","summary":"Migreringar är Djangos sätt att sprida ändringar som du gör i dina modeller (lägga till ett fält, ta bort en modell etc.) till ditt databasschema.","html":"<span id=\"migrations\"></span><h1>Migreringar<a class=\"heading-anchor\" href=\"#module-django.db.migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Migreringar är Djangos sätt att sprida ändringar som du gör i dina modeller (lägga till ett fält, ta bort en modell etc.) till ditt databasschema. De är utformade för att vara mestadels automatiska, men du måste veta när du ska göra migreringar, när du ska köra dem och de vanliga problem du kan stöta på.</p>\n<section id=\"the-commands\">\n<h2>Kommandon<a class=\"heading-anchor\" href=\"#the-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det finns flera kommandon som du kommer att använda för att interagera med migreringar och Djangos hantering av databasscheman:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>, som ansvarar för att applicera och avapplicera migreringar.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a>, som ansvarar för att skapa nya migreringar baserat på de ändringar du har gjort i dina modeller.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a>, som visar SQL-satserna för en migrering.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-showmigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">showmigrations</code></a>, som listar ett projekts migreringar och deras status.</p></li>\n</ul>\n<p>Du bör tänka på migreringar som ett versionskontrollsystem för ditt databasschema. <code class=\"docutils literal notranslate\">makemigrations</code> ansvarar för att paketera dina modelländringar i enskilda migreringsfiler - analogt med commits - och <code class=\"docutils literal notranslate\">migrate</code> ansvarar för att tillämpa dem på din databas.</p>\n<p>Migreringsfilerna för varje app finns i en ”migrations”-katalog inuti appen och är utformade för att läggas till och distribueras som en del av dess kodbas. Du bör göra dem en gång på din utvecklingsmaskin och sedan köra samma migreringar på dina kollegors maskiner, dina staging-maskiner och så småningom dina produktionsmaskiner.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Det är möjligt att åsidosätta namnet på paketet som innehåller migreringarna för varje enskild app genom att ändra inställningen <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-MIGRATION_MODULES\"><code class=\"xref std std-setting docutils literal notranslate\">MIGRATION_MODULES</code></a>.</p>\n</aside>\n<p>Migreringar körs på samma sätt på samma dataset och ger konsekventa resultat, vilket innebär att det du ser i utveckling och staging under samma omständigheter är exakt vad som kommer att hända i produktion.</p>\n<p>Django kommer att göra migreringar för alla ändringar av dina modeller eller fält - även alternativ som inte påverkar databasen - eftersom det enda sättet att rekonstruera ett fält korrekt är att ha alla ändringar i historiken, och du kan behöva dessa alternativ i vissa datamigreringar senare (till exempel om du har ställt in anpassade validerare).</p>\n</section>\n<section id=\"backend-support\">\n<h2>Support för backend<a class=\"heading-anchor\" href=\"#backend-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Migreringar stöds på alla backends som Django levereras med, liksom alla backends från tredje part om de har programmerat in stöd för schemaändring (görs via <a class=\"reference internal\" href=\"/sv/5.2/ref/schema-editor/\"><span class=\"doc\">SchemaEditor</span></a>-klassen).</p>\n<p>Vissa databaser är dock mer kapabla än andra när det gäller schemamigreringar; några av förbehållen tas upp nedan.</p>\n<section id=\"postgresql\">\n<h3>PostgreSQL<a class=\"heading-anchor\" href=\"#postgresql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>PostgreSQL är den mest kapabla av alla databaser här när det gäller schemastöd.</p>\n</section>\n<section id=\"mysql\">\n<h3>MySQL<a class=\"heading-anchor\" href=\"#mysql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL saknar stöd för transaktioner kring schemaändringsoperationer, vilket innebär att om en migrering misslyckas med att tillämpas måste du manuellt plocka bort ändringarna för att försöka igen (det är omöjligt att rulla tillbaka till en tidigare punkt).</p>\n<p>MySQL 8.0 introducerade betydande prestandaförbättringar för <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/innodb-online-ddl-operations.html\">DDL-operationer</a>, vilket gör dem mer effektiva och minskar behovet av fullständiga tabellåteruppbyggnader. Det kan dock inte garantera en fullständig frånvaro av lås eller avbrott. I situationer där lås fortfarande är nödvändiga kommer varaktigheten för dessa operationer att stå i proportion till antalet rader som är inblandade.</p>\n<p>Slutligen har MySQL en relativt liten gräns för den kombinerade storleken på alla kolumner som ett index täcker. Detta innebär att index som är möjliga på andra backends inte kommer att kunna skapas under MySQL.</p>\n</section>\n<section id=\"sqlite\">\n<h3>SQLite<a class=\"heading-anchor\" href=\"#sqlite\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite har mycket lite inbyggt stöd för schemaändring, och därför försöker Django emulera det genom att:</p>\n<ul class=\"simple\">\n<li><p>Skapa en ny tabell med det nya schemat</p></li>\n<li><p>Kopiering av data över</p></li>\n<li><p>Ta bort det gamla bordet</p></li>\n<li><p>Byt namn på den nya tabellen så att den matchar det ursprungliga namnet</p></li>\n</ul>\n<p>Den här processen fungerar i allmänhet bra, men den kan vara långsam och ibland buggig. Det rekommenderas inte att du kör och migrerar SQLite i en produktionsmiljö om du inte är mycket medveten om riskerna och dess begränsningar; det stöd som Django levereras med är utformat för att tillåta utvecklare att använda SQLite på sina lokala maskiner för att utveckla mindre komplexa Django-projekt utan behov av en fullständig databas.</p>\n</section>\n</section>\n<section id=\"workflow\">\n<h2>Arbetsflöde<a class=\"heading-anchor\" href=\"#workflow\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django kan skapa migreringar åt dig. Gör ändringar i dina modeller - lägg till exempel till ett fält och ta bort en modell - och kör sedan <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</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>$ python manage.py makemigrations\nMigrations <span class=\"k\">for</span> <span class=\"s1\">&#39;books&#39;</span>:\n  books/migrations/0003_auto.py:\n    ~ Alter field author on book\n</code></pre></div>\n<p>Dina modeller kommer att skannas och jämföras med de versioner som för närvarande finns i dina migreringsfiler, och sedan kommer en ny uppsättning migreringar att skrivas ut. Se till att läsa utdata för att se vad <code class=\"docutils literal notranslate\">makemigrations</code> tror att du har ändrat - den är inte perfekt, och för komplexa ändringar kanske den inte upptäcker vad du förväntar dig.</p>\n<p>När du har dina nya migreringsfiler bör du tillämpa dem på din databas för att se till att de fungerar som förväntat:</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>$ python manage.py migrate\nOperations to perform:\n  Apply all migrations: books\nRunning migrations:\n  Rendering model states... DONE\n  Applying books.0003_auto... OK\n</code></pre></div>\n<p>När migreringen har tillämpats ska du överföra migreringen och modelländringen till ditt versionshanteringssystem som en enda överföring - på så sätt får andra utvecklare (eller dina produktionsservrar) både ändringarna i dina modeller och den åtföljande migreringen samtidigt när de kontrollerar koden.</p>\n<p>Om du vill ge migreringarna ett meningsfullt namn i stället för ett genererat namn kan du använda alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-makemigrations-name\"><code class=\"xref std std-option docutils literal notranslate\">makemigrations --name</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>$ python manage.py makemigrations --name changed_my_model your_app_label\n</code></pre></div>\n<section id=\"version-control\">\n<h3>Versionskontroll<a class=\"heading-anchor\" href=\"#version-control\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Eftersom migreringar lagras i versionshanteringen kan du ibland stöta på situationer där du och en annan utvecklare har genomfört en migrering till samma app samtidigt, vilket resulterar i två migreringar med samma nummer.</p>\n<p>Oroa dig inte - siffrorna är bara där för utvecklarnas referens, Django bryr sig bara om att varje migrering har ett annat namn. Migreringar anger vilka andra migreringar de är beroende av - inklusive tidigare migreringar i samma app - i filen, så det är möjligt att upptäcka när det finns två nya migreringar för samma app som inte är ordnade.</p>\n<p>När detta händer kommer Django att fråga dig och ge dig några alternativ. Om det tycker att det är tillräckligt säkert kommer det att erbjuda att automatiskt linearisera de två migreringarna åt dig. Om inte, måste du gå in och modifiera migreringarna själv - oroa dig inte, det är inte svårt och förklaras mer i <a class=\"reference internal\" href=\"#migration-files\"><span class=\"std std-ref\">Migreringsfiler</span></a> nedan.</p>\n</section>\n</section>\n<section id=\"transactions\">\n<h2>Transaktioner<a class=\"heading-anchor\" href=\"#transactions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>På databaser som stöder DDL-transaktioner (SQLite och PostgreSQL) kommer alla migreringsoperationer att köras i en enda transaktion som standard. Om en databas däremot inte stöder DDL-transaktioner (t.ex. MySQL, Oracle) kommer alla operationer att köras utan en transaktion.</p>\n<p>Du kan förhindra att en migrering körs i en transaktion genom att ställa in attributet <code class=\"docutils literal notranslate\">atomic</code> till <code class=\"docutils literal notranslate\">False</code>. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    atomic <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<p>Det är också möjligt att utföra delar av migreringen inuti en transaktion med <a class=\"reference internal\" href=\"/sv/5.2/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> eller genom att skicka <code class=\"docutils literal notranslate\">atomic=True</code> till <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a>. Se <a class=\"reference internal\" href=\"/sv/5.2/howto/writing-migrations/#non-atomic-migrations\"><span class=\"std std-ref\">Icke-atomiska migreringar</span></a> för mer information.</p>\n</section>\n<section id=\"dependencies\">\n<h2>Beroenden<a class=\"heading-anchor\" href=\"#dependencies\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Även om migreringar sker per app är tabellerna och relationerna i dina modeller för komplexa för att skapas för en app i taget. När du gör en migrering som kräver att något annat körs - till exempel om du lägger till en <code class=\"docutils literal notranslate\">ForeignKey</code> i appen <code class=\"docutils literal notranslate\">books</code> till appen <code class=\"docutils literal notranslate\">authors</code> - kommer den resulterande migreringen att innehålla ett beroende av en migrering i <code class=\"docutils literal notranslate\">authors</code>.</p>\n<p>Detta innebär att när du kör migreringarna körs <code class=\"docutils literal notranslate\">authors</code>-migreringen först och skapar tabellen som <code class=\"docutils literal notranslate\">ForeignKey</code> refererar till, och sedan körs migreringen som skapar <code class=\"docutils literal notranslate\">ForeignKey</code>-kolumnen efteråt och skapar begränsningen. Om detta inte hände skulle migreringen försöka skapa kolumnen <code class=\"docutils literal notranslate\">ForeignKey</code> utan att tabellen som den hänvisar till existerar och din databas skulle ge ett fel.</p>\n<p>Detta beroendebeteende påverkar de flesta migreringar där du begränsar till en enda app. Att begränsa till en enda app (antingen i <code class=\"docutils literal notranslate\">makemigrations</code> eller <code class=\"docutils literal notranslate\">migrate</code>) är ett löfte om bästa möjliga ansträngning och inte en garanti; alla andra appar som behöver användas för att få beroenden korrekta kommer att bli det.</p>\n<p>Appar utan migreringar får inte ha relationer (<code class=\"docutils literal notranslate\">ForeignKey</code>, <code class=\"docutils literal notranslate\">ManyToManyField</code>, etc.) till appar med migreringar. Ibland kan det fungera, men det stöds inte.</p>\n<section id=\"swappable-dependencies\">\n<h3>Utbytbara beroenden<a class=\"heading-anchor\" href=\"#swappable-dependencies\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.django.db.migrations.swappable_dependency\">\n<span class=\"sig-prename descclassname\">django.db.migrations.</span><span class=\"sig-name descname\">swappable_dependency</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.django.db.migrations.swappable_dependency\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Funktionen <code class=\"docutils literal notranslate\">swappable_dependency()</code> används i migreringar för att deklarera ”swappable” beroenden av migreringar i appen för den inbytta modellen, för närvarande vid den första migreringen av denna app. Som en följd av detta bör den inbytta modellen skapas i den första migreringen. Argumentet <code class=\"docutils literal notranslate\">value</code> är en sträng <code class=\"docutils literal notranslate\">&quot;&lt;app label&gt;.&lt;model&gt;&quot;</code> som beskriver en appetikett och ett modellnamn, t.ex. <code class=\"docutils literal notranslate\">&quot;myapp.MyModel&quot;</code>.</p>\n<p>Genom att använda <code class=\"docutils literal notranslate\">swappable_dependency()</code> informerar du migreringsramverket om att migreringen är beroende av en annan migrering som skapar en swappable-modell, vilket ger möjlighet att ersätta modellen med en annan implementering i framtiden. Detta används vanligtvis för att referera till modeller som är föremål för anpassning eller ersättning, till exempel den anpassade användarmodellen (<code class=\"docutils literal notranslate\">settings.AUTH_USER_MODEL</code>, som standard är <code class=\"docutils literal notranslate\">&quot;auth.User&quot;</code>) i Djangos autentiseringssystem.</p>\n</section>\n</section>\n<section id=\"migration-files\">\n<span id=\"id1\"></span><h2>Migreringsfiler<a class=\"heading-anchor\" href=\"#migration-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Migreringar lagras i ett diskformat som här kallas ”migreringsfiler”. Dessa filer är egentligen vanliga Python-filer med en överenskommen objektlayout, skrivna i en deklarativ stil.</p>\n<p>En grundläggande migreringsfil ser ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations<span class=\"p\">,</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"s2\">&quot;migrations&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">)]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>DeleteModel<span class=\"p\">(</span><span class=\"s2\">&quot;Tribble&quot;</span><span class=\"p\">),</span>\n        migrations<span class=\"o\">.</span>AddField<span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">,</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>Vad Django letar efter när den laddar en migreringsfil (som en Python-modul) är en underklass av <code class=\"docutils literal notranslate\">django.db.migrations.Migration</code> som heter <code class=\"docutils literal notranslate\">Migration</code>. Det inspekterar sedan detta objekt för fyra attribut, varav endast två används för det mesta:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">dependencies</code>, en lista över migreringar som den här beror på.</p></li>\n<li><p><code class=\"docutils literal notranslate\">operations</code>, en lista över <code class=\"docutils literal notranslate\">Operation</code>-klasser som definierar vad denna migrering gör.</p></li>\n</ul>\n<p>Operationerna är nyckeln; de är en uppsättning deklarativa instruktioner som talar om för Django vilka schemaändringar som behöver göras. Django skannar dem och bygger en representation i minnet av alla schemaändringar för alla appar och använder detta för att generera SQL som gör schemaändringarna.</p>\n<p>Den minnesstrukturen används också för att ta reda på vad skillnaderna är mellan dina modeller och det aktuella läget för dina migreringar; Django kör igenom alla ändringar, i ordning, på en minnesuppsättning av modeller för att komma fram till läget för dina modeller förra gången du körde <code class=\"docutils literal notranslate\">makemigrations</code>. Den använder sedan dessa modeller för att jämföra med dem i dina <code class=\"docutils literal notranslate\">models.py</code>-filer för att räkna ut vad du har ändrat.</p>\n<p>Du behöver sällan eller aldrig redigera migreringsfiler för hand, men det är fullt möjligt att skriva dem manuellt om du behöver. Vissa av de mer komplexa operationerna kan inte autodetekteras och är endast tillgängliga via en handskriven migrering, så var inte rädd för att redigera dem om du måste.</p>\n<section id=\"custom-fields\">\n<h3>Anpassade fält<a class=\"heading-anchor\" href=\"#custom-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan inte ändra antalet positionella argument i ett redan migrerat anpassat fält utan att det uppstår ett <code class=\"docutils literal notranslate\">TypeError</code>. Den gamla migreringen kommer att anropa den modifierade metoden <code class=\"docutils literal notranslate\">__init__</code> med den gamla signaturen. Så om du behöver ett nytt argument, skapa ett nyckelordsargument och lägg till något i stil med <code class=\"docutils literal notranslate\">assert 'argument_name' in kwargs</code> i konstruktören.</p>\n</section>\n<section id=\"model-managers\">\n<span id=\"using-managers-in-migrations\"></span><h3>Modell chefer<a class=\"heading-anchor\" href=\"#model-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan valfritt serialisera chefer till migreringar och ha dem tillgängliga i <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a>-operationer. Detta görs genom att definiera ett <code class=\"docutils literal notranslate\">use_in_migrations</code>-attribut på managerklassen:</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\">class</span> <span class=\"nc\">MyManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    use_in_migrations <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    objects <span class=\"o\">=</span> MyManager<span class=\"p\">()</span>\n</code></pre></div>\n<p>Om du använder funktionen <a class=\"reference internal\" href=\"/sv/5.2/topics/db/managers/#django.db.models.from_queryset\" title=\"django.db.models.from_queryset\"><code class=\"xref py py-meth docutils literal notranslate\">from_queryset()</code></a> för att dynamiskt generera en managerklass måste du ärva från den genererade klassen för att göra den importerbar:</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\">class</span> <span class=\"nc\">MyManager</span><span class=\"p\">(</span>MyBaseManager<span class=\"o\">.</span>from_queryset<span class=\"p\">(</span>CustomQuerySet<span class=\"p\">)):</span>\n    use_in_migrations <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    objects <span class=\"o\">=</span> MyManager<span class=\"p\">()</span>\n</code></pre></div>\n<p>Se anteckningarna om <a class=\"reference internal\" href=\"#historical-models\"><span class=\"std std-ref\">Historiska modeller</span></a> i migreringar för att se vilka konsekvenser som följer med.</p>\n</section>\n<section id=\"initial-migrations\">\n<h3>Inledande migreringar<a class=\"heading-anchor\" href=\"#initial-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.Migration.initial\">\n<span class=\"sig-prename descclassname\">Migration.</span><span class=\"sig-name descname\">initial</span><a class=\"heading-anchor\" href=\"#django.db.migrations.Migration.initial\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>De ”initiala migreringarna” för en app är de migreringar som skapar den första versionen av appens tabeller. Vanligtvis har en app en första migrering, men i vissa fall med komplexa modellberoenden kan den ha två eller fler.</p>\n<p>Initiala migreringar markeras med ett klassattribut <code class=\"docutils literal notranslate\">initial = True</code> på migreringsklassen. Om klassattributet <code class=\"docutils literal notranslate\">initial</code> inte hittas betraktas en migrering som ”initial” om den är den första migreringen i appen (dvs. om den inte har några beroenden till någon annan migrering i samma app).</p>\n<p>När alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-migrate-fake-initial\"><code class=\"xref std std-option docutils literal notranslate\">migrate --fake-initial</code></a> används, behandlas dessa initiala migreringar speciellt. För en initial migrering som skapar en eller flera tabeller (<code class=\"docutils literal notranslate\">CreateModel</code> operation), kontrollerar Django att alla dessa tabeller redan finns i databasen och tillämpar migreringen om så är fallet. På samma sätt, för en initial migrering som lägger till ett eller flera fält (<code class=\"docutils literal notranslate\">AddField</code> operation), kontrollerar Django att alla respektive kolumner redan finns i databasen och fejkapplicerar migreringen om så är fallet. Utan <code class=\"docutils literal notranslate\">--fake-initial</code> behandlas initiala migreringar inte annorlunda än någon annan migrering.</p>\n</section>\n<section id=\"history-consistency\">\n<span id=\"migration-history-consistency\"></span><h3>Historisk konsekvens<a class=\"heading-anchor\" href=\"#history-consistency\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Som tidigare nämnts kan du behöva linjärisera migreringar manuellt när två utvecklingsgrenar sammanfogas. När du redigerar migreringsberoenden kan du oavsiktligt skapa ett inkonsekvent historiktillstånd där en migrering har tillämpats men vissa av dess beroenden inte har gjort det. Detta är en stark indikation på att beroendena är felaktiga, så Django kommer att vägra att köra migreringar eller göra nya migreringar tills det är åtgärdat. När du använder flera databaser kan du använda metoden <a class=\"reference internal\" href=\"/sv/5.2/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\">allow_migrate()</code></a> i <a class=\"reference internal\" href=\"/sv/5.2/topics/db/multi-db/#topics-db-multi-db-routing\"><span class=\"std std-ref\">database routers</span></a> för att kontrollera vilka databaser som <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> kontrollerar för konsekvent historik.</p>\n</section>\n</section>\n<section id=\"adding-migrations-to-apps\">\n<h2>Lägga till migreringar i appar<a class=\"heading-anchor\" href=\"#adding-migrations-to-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nya appar är förkonfigurerade för att acceptera migreringar, så du kan lägga till migreringar genom att köra <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> när du har gjort några ändringar.</p>\n<p>Om din app redan har modeller och databastabeller och inte har migreringar ännu (till exempel om du skapade den mot en tidigare Django-version) måste du konvertera den till att använda migreringar genom att köra:</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>$ python manage.py makemigrations your_app_label\n</code></pre></div>\n<p>Detta kommer att skapa en ny initial migrering för din app. Kör nu <code class=\"docutils literal notranslate\">python manage.py migrate --fake-initial</code>, och Django kommer att upptäcka att du har en initial migrering <em>och</em> att de tabeller som den vill skapa redan finns, och kommer att markera migreringen som redan tillämpad. (Utan <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-migrate-fake-initial\"><code class=\"xref std std-option docutils literal notranslate\">migrate --fake-initial</code></a> flaggan skulle kommandot misslyckas eftersom tabellerna som den vill skapa redan existerar)</p>\n<p>Observera att detta bara fungerar under förutsättning att två saker inträffar:</p>\n<ul class=\"simple\">\n<li><p>Du har inte ändrat dina modeller sedan du skapade deras tabeller. För att migreringar ska fungera måste du göra den första migreringen <em>först</em> och sedan göra ändringar, eftersom Django jämför ändringar mot migreringsfiler, inte databasen.</p></li>\n<li><p>Du har inte redigerat din databas manuellt - Django kommer inte att kunna upptäcka att din databas inte matchar dina modeller, du kommer bara att få fel när migreringar försöker ändra dessa tabeller.</p></li>\n</ul>\n</section>\n<section id=\"reversing-migrations\">\n<span id=\"id2\"></span><h2>Återvändande av migration<a class=\"heading-anchor\" href=\"#reversing-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Migreringar kan återställas med <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> genom att ange numret på den föregående migreringen. Till exempel, för att vända migreringen <code class=\"docutils literal notranslate\">books.0003</code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><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><span class=\"gp\">$ </span>python manage.py migrate books <span class=\"m\">0002</span>\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Target specific migration: 0002_auto, from books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0003_auto... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate books 0002\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Target specific migration: 0002_auto, from books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0003_auto... OK</span>\n</code></pre></div></div></div>\n<p>Använd namnet <code class=\"docutils literal notranslate\">zero</code> om du vill återkalla alla migreringar som gjorts för en app:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><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><span class=\"gp\">$ </span>python manage.py migrate books zero\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Unapply all migrations: books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0002_auto... OK</span>\n<span class=\"go\">  Unapplying books.0001_initial... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate books zero\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Unapply all migrations: books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0002_auto... OK</span>\n<span class=\"go\">  Unapplying books.0001_initial... OK</span>\n</code></pre></div></div></div>\n<p>En migrering är irreversibel om den innehåller några irreversibla åtgärder. Försök att vända sådana migreringar kommer att ge upphov till <code class=\"docutils literal notranslate\">IrreversibleError</code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><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><span class=\"gp\">$ </span>python manage.py migrate books <span class=\"m\">0002</span>\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Target specific migration: 0002_auto, from books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0003_auto...Traceback (most recent call last):</span>\n<span class=\"go\">django.db.migrations.exceptions.IrreversibleError: Operation &lt;RunSQL  sql=&#39;DROP TABLE demo_books&#39;&gt; in books.0003_auto is not reversible</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate books 0002\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Target specific migration: 0002_auto, from books</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Unapplying books.0003_auto...Traceback (most recent call last):</span>\n<span class=\"gp\">django.db.migrations.exceptions.IrreversibleError: Operation &lt;RunSQL  sql=&#39;DROP TABLE demo_books&#39;&gt;</span> in books.0003_auto is not reversible\n</code></pre></div></div></div>\n</section>\n<section id=\"historical-models\">\n<span id=\"id3\"></span><h2>Historiska modeller<a class=\"heading-anchor\" href=\"#historical-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>När du kör migreringar arbetar Django från historiska versioner av dina modeller som lagras i migreringsfilerna. Om du skriver Python-kod med hjälp av <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a>, eller om du har <code class=\"docutils literal notranslate\">allow_migrate</code>-metoder på dina databasroutrar, måste du <strong>använda</strong> dessa historiska modellversioner istället för att importera dem direkt.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Om du importerar modeller direkt i stället för att använda de historiska modellerna kan dina migreringar <em>fungera initialt</em>, men de kommer att misslyckas i framtiden när du försöker köra gamla migreringar igen (vanligtvis när du skapar en ny installation och kör igenom alla migreringar för att skapa databasen).</p>\n<p>Detta innebär att problem med historiska modeller kanske inte är omedelbart uppenbara. Om du stöter på den här typen av fel är det OK att redigera migreringen så att den använder de historiska modellerna i stället för direktimport och genomföra dessa ändringar.</p>\n</aside>\n<p>Eftersom det är omöjligt att serialisera godtycklig Python-kod kommer dessa historiska modeller inte att ha några anpassade metoder som du har definierat. De kommer dock att ha samma fält, relationer, chefer (begränsat till dem med <code class=\"docutils literal notranslate\">use_in_migrations = True</code>) och <code class=\"docutils literal notranslate\">Meta</code>-alternativ (även versionerade, så de kan skilja sig från dina nuvarande).</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Detta innebär att du INTE kommer att ha anpassade <code class=\"docutils literal notranslate\">save()</code>-metoder som anropas på objekt när du kommer åt dem i migreringar, och du kommer INTE att ha några anpassade konstruktörer eller instansmetoder. Planera på lämpligt sätt!</p>\n</aside>\n<p>Hänvisningar till funktioner i fältalternativ som <code class=\"docutils literal notranslate\">upload_to</code> och <code class=\"docutils literal notranslate\">limit_choices_to</code> och modellhanterardeklarationer med hanterare som har <code class=\"docutils literal notranslate\">use_in_migrations = True</code> serialiseras i migreringar, så funktionerna och klasserna måste sparas så länge det finns en migrering som hänvisar till dem. Eventuella <a class=\"reference internal\" href=\"/sv/5.2/howto/custom-model-fields/\"><span class=\"doc\">custom model fields</span></a> måste också sparas, eftersom dessa importeras direkt av migreringar.</p>\n<p>Dessutom lagras modellens konkreta basklasser som pekare, så du måste alltid ha kvar basklasserna så länge det finns en migration som innehåller en referens till dem. På plussidan är att metoder och managers från dessa basklasser ärvs normalt, så om man absolut behöver tillgång till dessa kan man välja att flytta dem till en superklass.</p>\n<p>För att ta bort gamla referenser kan du <a class=\"reference internal\" href=\"#migration-squashing\"><span class=\"std std-ref\">squash migrations</span></a> eller, om det inte finns så många referenser, kopiera dem till migreringsfilerna.</p>\n</section>\n<section id=\"considerations-when-removing-model-fields\">\n<span id=\"migrations-removing-model-fields\"></span><h2>Överväganden vid borttagning av modellfält<a class=\"heading-anchor\" href=\"#considerations-when-removing-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>På samma sätt som när det gäller ”referenser till historiska funktioner” i föregående avsnitt kan det uppstå problem om du tar bort anpassade modellfält från ditt projekt eller din tredjepartsapp om de refereras till i gamla migreringar.</p>\n<p>För att hjälpa till med den här situationen tillhandahåller Django några modellfältsattribut för att hjälpa till med borttagning av modellfält med hjälp av <a class=\"reference internal\" href=\"/sv/5.2/topics/checks/\"><span class=\"doc\">systemets ramverk för kontroller</span></a>.</p>\n<p>Lägg till attributet <code class=\"docutils literal notranslate\">system_check_deprecated_details</code> till ditt modellfält på följande sätt:</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\">class</span> <span class=\"nc\">IPAddressField</span><span class=\"p\">(</span>Field<span class=\"p\">):</span>\n    system_check_deprecated_details <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;msg&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n            <span class=\"s2\">&quot;IPAddressField has been deprecated. Support for it (except &quot;</span>\n            <span class=\"s2\">&quot;in historical migrations) will be removed in Django 1.9.&quot;</span>\n        <span class=\"p\">),</span>\n        <span class=\"s2\">&quot;hint&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Use GenericIPAddressField instead.&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># optional</span>\n        <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;fields.W900&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># pick a unique ID for your field.</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>Efter en utfasningsperiod som du väljer (två eller tre funktionsutgåvor för fält i Django själv), ändra attributet <code class=\"docutils literal notranslate\">system_check_deprecated_details</code> till <code class=\"docutils literal notranslate\">system_check_removed_details</code> och uppdatera ordlistan på liknande sätt:</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\">class</span> <span class=\"nc\">IPAddressField</span><span class=\"p\">(</span>Field<span class=\"p\">):</span>\n    system_check_removed_details <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;msg&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n            <span class=\"s2\">&quot;IPAddressField has been removed except for support in &quot;</span>\n            <span class=\"s2\">&quot;historical migrations.&quot;</span>\n        <span class=\"p\">),</span>\n        <span class=\"s2\">&quot;hint&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Use GenericIPAddressField instead.&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;fields.E900&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># pick a unique ID for your field.</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>Du bör behålla fältets metoder som krävs för att det ska fungera i databasmigreringar, t.ex. <code class=\"docutils literal notranslate\">__init__()</code>, <code class=\"docutils literal notranslate\">deconstruct()</code> och <code class=\"docutils literal notranslate\">get_internal_type()</code>. Behåll detta stubbfält så länge som de migreringar som refererar till fältet existerar. Till exempel, efter att ha krossat migreringar och tagit bort de gamla, bör du kunna ta bort fältet helt och hållet.</p>\n</section>\n<section id=\"data-migrations\">\n<span id=\"id4\"></span><h2>Migrering av data<a class=\"heading-anchor\" href=\"#data-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Förutom att ändra databasschemat kan du också använda migreringar för att ändra data i själva databasen, i kombination med schemat om du vill.</p>\n<p>Migreringar som ändrar data kallas vanligtvis ”datamigreringar”; det är bäst att skriva dem som separata migreringar vid sidan av dina schemamigreringar.</p>\n<p>Django kan inte automatiskt generera datamigreringar åt dig, som det gör med schemamigreringar, men det är inte särskilt svårt att skriva dem. Migreringsfiler i Django består av <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/\"><span class=\"doc\">Operations</span></a>, och den huvudsakliga operationen du använder för datamigreringar är <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a>.</p>\n<p>Börja med att skapa en tom migreringsfil som du kan arbeta utifrån (Django placerar filen på rätt plats, föreslår ett namn och lägger till beroenden åt dig):</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>python manage.py makemigrations --empty yourappname\n</code></pre></div>\n<p>Öppna sedan filen; den ska se ut ungefär så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Generated by Django A.B on YYYY-MM-DD HH:MM</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;yourappname&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[]</span>\n</code></pre></div>\n<p>Nu är allt du behöver göra att skapa en ny funktion och få <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> att använda den. <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> förväntar sig en callable som sitt argument som tar två argument - det första är en <a class=\"reference internal\" href=\"/sv/5.2/ref/applications/\"><span class=\"doc\">app registry</span></a> som har de historiska versionerna av alla dina modeller laddade i den för att matcha var i din historia migreringen sitter, och den andra är en <a class=\"reference internal\" href=\"/sv/5.2/ref/schema-editor/\"><span class=\"doc\">SchemaEditor</span></a>, som du kan använda för att manuellt utföra databasschemaändringar (men se upp, att göra detta kan förvirra migreringsautodetektorn!)</p>\n<p>Låt oss skriva en migrering som fyller vårt nya fält <code class=\"docutils literal notranslate\">name</code> med de kombinerade värdena för <code class=\"docutils literal notranslate\">first_name</code> och <code class=\"docutils literal notranslate\">last_name</code> (vi har tagit vårt förnuft till fånga och insett att alla inte har för- och efternamn). Allt vi behöver göra är att använda den historiska modellen och iterera över raderna:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">def</span> <span class=\"nf\">combine_names</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    <span class=\"c1\"># We can&#39;t import the Person model directly as it may be a newer</span>\n    <span class=\"c1\"># version than this migration expects. We use the historical version.</span>\n    Person <span class=\"o\">=</span> apps<span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s2\">&quot;yourappname&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Person&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> person <span class=\"ow\">in</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">():</span>\n        person<span class=\"o\">.</span>name <span class=\"o\">=</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span>person<span class=\"o\">.</span>first_name<span class=\"si\">}</span><span class=\"s2\"> </span><span class=\"si\">{</span>person<span class=\"o\">.</span>last_name<span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n        person<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;yourappname&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>combine_names<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>När det är gjort kan vi köra <code class=\"docutils literal notranslate\">python manage.py migrate</code> som vanligt och datamigreringen kommer att köras på plats tillsammans med andra migreringar.</p>\n<p>Du kan skicka en andra callable till <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> för att köra den logik du vill ska köras när du migrerar bakåt. Om denna callable utelämnas kommer migreringen bakåt att ge upphov till ett undantag.</p>\n<section id=\"accessing-models-from-other-apps\">\n<h3>Åtkomst till modeller från andra appar<a class=\"heading-anchor\" href=\"#accessing-models-from-other-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du skriver en <code class=\"docutils literal notranslate\">RunPython</code>-funktion som använder modeller från andra appar än den där migreringen finns, bör migreringens <code class=\"docutils literal notranslate\">dependencies</code>-attribut innehålla den senaste migreringen av varje app som är inblandad, annars kan du få ett fel som liknar: <code class=\"docutils literal notranslate\">LookupError: No installed app with label 'myappname'</code> när du försöker hämta modellen i <code class=\"docutils literal notranslate\">RunPython</code>-funktionen med hjälp av <code class=\"docutils literal notranslate\">apps.get_model()</code>.</p>\n<p>I följande exempel har vi en migrering i <code class=\"docutils literal notranslate\">app1</code> som behöver använda modeller i <code class=\"docutils literal notranslate\">app2</code>. Vi bryr oss inte om detaljerna i <code class=\"docutils literal notranslate\">move_m1</code> annat än att den kommer att behöva komma åt modeller från båda apparna. Därför har vi lagt till ett beroende som anger den senaste migreringen av <code class=\"docutils literal notranslate\">app2</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=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;app1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">),</span>\n        <span class=\"c1\"># added dependency to enable using models from app2 in move_m1</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;app2&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0004_foobar&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>move_m1<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"more-advanced-migrations\">\n<h3>Mer avancerade migreringar<a class=\"heading-anchor\" href=\"#more-advanced-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du är intresserad av de mer avancerade migreringsoperationerna eller vill kunna skriva dina egna, se <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/\"><span class=\"doc\">migration operations reference</span></a> och ”how-to” på <a class=\"reference internal\" href=\"/sv/5.2/howto/writing-migrations/\"><span class=\"doc\">writing migrations</span></a>.</p>\n</section>\n</section>\n<section id=\"squashing-migrations\">\n<span id=\"migration-squashing\"></span><h2>Minska antalet migreringar<a class=\"heading-anchor\" href=\"#squashing-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Du uppmuntras att göra migreringar fritt och inte oroa dig för hur många du har; migreringskoden är optimerad för att hantera hundratals åt gången utan större nedgång. Men så småningom kommer du att vilja gå tillbaka från att ha flera hundra migreringar till bara några få, och det är där squashing kommer in i bilden.</p>\n<p>Squashing innebär att man reducerar en befintlig uppsättning med många migreringar till en (eller ibland ett fåtal) migreringar som fortfarande representerar samma ändringar.</p>\n<p>Django gör detta genom att ta alla dina befintliga migreringar, extrahera deras <code class=\"docutils literal notranslate\">Operation</code> och sätta dem alla i ordning, och sedan köra en optimerare över dem för att försöka minska längden på listan - till exempel vet den att <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.CreateModel\" title=\"django.db.migrations.operations.CreateModel\"><code class=\"xref py py-class docutils literal notranslate\">CreateModel</code></a> och <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.DeleteModel\" title=\"django.db.migrations.operations.DeleteModel\"><code class=\"xref py py-class docutils literal notranslate\">DeleteModel</code></a> upphäver varandra, och den vet att <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.AddField\" title=\"django.db.migrations.operations.AddField\"><code class=\"xref py py-class docutils literal notranslate\">AddField</code></a> kan rullas in i <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.CreateModel\" title=\"django.db.migrations.operations.CreateModel\"><code class=\"xref py py-class docutils literal notranslate\">CreateModel</code></a>.</p>\n<p>När operationssekvensen har reducerats så mycket som möjligt - hur mycket som är möjligt beror på hur nära sammanflätade dina modeller är och om du har några <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\">RunSQL</code></a> eller <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> operationer (som inte kan optimeras om de inte är markerade som <code class=\"docutils literal notranslate\">elidable</code>) - kommer Django sedan att skriva ut det igen i en ny uppsättning migreringsfiler.</p>\n<p>Dessa filer är markerade för att säga att de ersätter de tidigare krossade migreringarna, så de kan samexistera med de gamla migreringsfilerna, och Django kommer intelligent att växla mellan dem beroende på var du befinner dig i historiken. Om du fortfarande är halvvägs genom den uppsättning migreringar som du krossade kommer den att fortsätta använda dem tills den når slutet och sedan byta till den krossade historiken, medan nya installationer kommer att använda den nya krossade migreringen och hoppa över alla de gamla.</p>\n<p>Detta gör att du kan göra en squash och inte förstöra system som för närvarande är i produktion och som inte är helt uppdaterade ännu. Den rekommenderade processen är att krossa, behålla de gamla filerna, commita och släppa, vänta tills alla system är uppgraderade med den nya versionen (eller om du är ett tredjepartsprojekt, se till att dina användare uppgraderar versioner i ordning utan att hoppa över någon), och sedan ta bort de gamla filerna, commita och göra en andra version.</p>\n<p>Kommandot som ligger bakom allt detta är <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-squashmigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">squashmigrations</code></a> - skicka appens etikett och migreringsnamnet som du vill squasha upp till, så börjar det arbeta:</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>$ ./manage.py squashmigrations myapp <span class=\"m\">0004</span>\nWill squash the following migrations:\n - 0001_initial\n - 0002_some_change\n - 0003_another_change\n - 0004_undo_something\nDo you wish to proceed? <span class=\"o\">[</span>y/N<span class=\"o\">]</span> y\nOptimizing...\n  Optimized from <span class=\"m\">12</span> operations to <span class=\"m\">7</span> operations.\nCreated new squashed migration /home/andrew/Programs/DjangoTest/test/migrations/0001_squashed_0004_undo_something.py\n  You should commit this migration but leave the old ones <span class=\"k\">in</span> place<span class=\"p\">;</span>\n  the new migration will be used <span class=\"k\">for</span> new installs. Once you are sure\n  all instances of the codebase have applied the migrations you squashed,\n  you can delete them.\n</code></pre></div>\n<p>Använd alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-squashmigrations-squashed-name\"><code class=\"xref std std-option docutils literal notranslate\">squashmigrations --squashed-name</code></a> om du vill ange namnet på den krossade migreringen i stället för att använda ett autogenererat namn.</p>\n<p>Observera att modellberoenden i Django kan bli mycket komplexa, och squashing kan resultera i migreringar som inte körs; antingen feloptimerade (i vilket fall du kan försöka igen med <code class=\"docutils literal notranslate\">--no-optimize</code>, men du bör också rapportera ett problem), eller med ett <code class=\"docutils literal notranslate\">CircularDependencyError</code>, i vilket fall du kan lösa det manuellt.</p>\n<p>För att manuellt lösa ett <code class=\"docutils literal notranslate\">CircularDependencyError</code>, bryt ut en av ForeignKeys i den cirkulära beroendeslingan till en separat migrering och flytta beroendet av den andra appen med den. Om du är osäker kan du se hur <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> hanterar problemet när den ombeds skapa helt nya migreringar från dina modeller. I en framtida version av Django kommer <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-squashmigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">squashmigrations</code></a> att uppdateras för att försöka lösa dessa fel själv.</p>\n<p>När du har krossat din migrering bör du sedan överföra den tillsammans med de migreringar som den ersätter och distribuera denna ändring till alla körande instanser av din applikation och se till att de kör <code class=\"docutils literal notranslate\">migrate</code> för att lagra ändringen i sin databas.</p>\n<p>Du måste sedan överföra den krossade migreringen till en normal migrering genom att:</p>\n<ul class=\"simple\">\n<li><p>Raderar alla migreringsfiler som den ersätter.</p></li>\n<li><p>Uppdaterar alla migreringar som är beroende av de borttagna migreringarna så att de istället är beroende av den krossade migreringen.</p></li>\n<li><p>Ta bort attributet <code class=\"docutils literal notranslate\">replaces</code> i klassen <code class=\"docutils literal notranslate\">Migration</code> för den krossade migreringen (det är så Django berättar att det är en krossad migrering).</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>När du har krossat en migrering ska du inte krossa den krossade migreringen igen förrän du helt har omvandlat den till en normal migrering.</p>\n</aside>\n<aside class=\"admonition-pruning-references-to-deleted-migrations admonition\" role=\"note\">\n<p class=\"admonition-title\">Rensning av referenser till raderade migreringar</p>\n<p>Om det är troligt att du kommer att återanvända namnet på en borttagen migrering i framtiden bör du ta bort referenser till den från Djangos migreringstabell med alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-migrate-prune\"><code class=\"xref std std-option docutils literal notranslate\">migrate --prune</code></a>.</p>\n</aside>\n</section>\n<section id=\"serializing-values\">\n<span id=\"migration-serializing\"></span><h2>Serialisering av värden<a class=\"heading-anchor\" href=\"#serializing-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Migrationer är Python-filer som innehåller de gamla definitionerna av dina modeller - för att skriva dem måste Django alltså ta det aktuella tillståndet för dina modeller och serialisera dem till en fil.</p>\n<p>Django kan serialisera det mesta, men det finns vissa saker som vi helt enkelt inte kan serialisera ut till en giltig Python-representation - det finns ingen Python-standard för hur ett värde kan omvandlas tillbaka till kod (<code class=\"docutils literal notranslate\">repr()</code> fungerar bara för grundläggande värden och anger inte importvägar).</p>\n<p>Django kan serialisera följande:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">int</code>, <code class=\"docutils literal notranslate\">float</code>, <code class=\"docutils literal notranslate\">bool</code>, <code class=\"docutils literal notranslate\">str</code>, <code class=\"docutils literal notranslate\">bytes</code>, <code class=\"docutils literal notranslate\">None</code>, <code class=\"docutils literal notranslate\">NoneType</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">list</code>, <code class=\"docutils literal notranslate\">set</code>, <code class=\"docutils literal notranslate\">tuple</code>, <code class=\"docutils literal notranslate\">dict</code>, <code class=\"docutils literal notranslate\">range</code>.</p></li>\n<li><p>instanser av <code class=\"docutils literal notranslate\">datetime.date</code>, <code class=\"docutils literal notranslate\">datetime.time</code> och <code class=\"docutils literal notranslate\">datetime.datetime</code> (inklusive de som är tidszonmedvetna)</p></li>\n<li><p><code class=\"docutils literal notranslate\">decimal.Decimal</code> instanser</p></li>\n<li><p>instanser av <code class=\"docutils literal notranslate\">enum.Enum</code> och <code class=\"docutils literal notranslate\">enum.Flag</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">uuid.UUID</code> instanser</p></li>\n<li><p><a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.partial\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">functools.partial()</code></a> och <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.partialmethod\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">functools.partialmethod</code></a> instanser som har serialiserbara <code class=\"docutils literal notranslate\">func</code>, <code class=\"docutils literal notranslate\">args</code> och <code class=\"docutils literal notranslate\">keywords</code> värden.</p></li>\n<li><p>Rena och konkreta sökvägsobjekt från <a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#module-pathlib\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">pathlib</code></a>. Konkreta sökvägar konverteras till deras rena sökvägsekvivalenter, t.ex. <a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#pathlib.PosixPath\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">pathlib.PosixPath</code></a> till <a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#pathlib.PurePosixPath\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">pathlib.PurePosixPath</code></a>.</p></li>\n<li><p><a class=\"reference external\" href=\"https://docs.python.org/3/library/os.html#os.PathLike\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">os.PathLike</code></a>-instanser, t.ex. <a class=\"reference external\" href=\"https://docs.python.org/3/library/os.html#os.DirEntry\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">os.DirEntry</code></a>, som konverteras till <code class=\"docutils literal notranslate\">str</code> eller <code class=\"docutils literal notranslate\">bytes</code> med <a class=\"reference external\" href=\"https://docs.python.org/3/library/os.html#os.fspath\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">os.fspath()</code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">LazyObject</code>-instanser som omsluter ett serialiserbart värde.</p></li>\n<li><p>Instanser av uppräkningstyper (t.ex. <code class=\"docutils literal notranslate\">TextChoices</code> eller <code class=\"docutils literal notranslate\">IntegerChoices</code>).</p></li>\n<li><p>Alla Django-fält</p></li>\n<li><p>Alla funktions- eller metodreferenser (t.ex. <code class=\"docutils literal notranslate\">datetime.datetime.today</code>) (måste finnas i modulens toppnivå)</p>\n<ul>\n<li><p>Funktioner kan dekoreras om de förpackas på rätt sätt, dvs. med <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.wraps\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">functools.wraps()</code></a></p></li>\n<li><p>Dekoratorerna <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.cache\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">functools.cache()</code></a> och <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.lru_cache\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">functools.lru_cache()</code></a> stöds uttryckligen</p></li>\n</ul>\n</li>\n<li><p>Obundna metoder som används inom klassens kropp</p></li>\n<li><p>Vilken klassreferens som helst (måste finnas i modulens toppnivåscope)</p></li>\n<li><p>Allt med en anpassad <code class=\"docutils literal notranslate\">deconstruct()</code>-metod (<a class=\"reference internal\" href=\"#custom-deconstruct-method\"><span class=\"std std-ref\">se nedan</span></a>)</p></li>\n</ul>\n<p>Django kan inte serialisera:</p>\n<ul class=\"simple\">\n<li><p>Nästlade klasser</p></li>\n<li><p>Godtyckliga klassinstanser (t.ex. <code class=\"docutils literal notranslate\">MyClass(4.3, 5.7)</code>)</p></li>\n<li><p>Lambdas</p></li>\n</ul>\n<section id=\"custom-serializers\">\n<span id=\"custom-migration-serializers\"></span><h3>Anpassade serialiserare<a class=\"heading-anchor\" href=\"#custom-serializers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan serialisera andra typer genom att skriva en anpassad serializer. Till exempel, om Django inte serialiserade <a class=\"reference external\" href=\"https://docs.python.org/3/library/decimal.html#decimal.Decimal\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">Decimal</code></a> som standard, skulle du kunna göra så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">decimal</span> <span class=\"kn\">import</span> Decimal\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.migrations.serializer</span> <span class=\"kn\">import</span> BaseSerializer\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.migrations.writer</span> <span class=\"kn\">import</span> MigrationWriter\n\n\n<span class=\"k\">class</span> <span class=\"nc\">DecimalSerializer</span><span class=\"p\">(</span>BaseSerializer<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">serialize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">repr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>value<span class=\"p\">),</span> <span class=\"p\">{</span><span class=\"s2\">&quot;from decimal import Decimal&quot;</span><span class=\"p\">}</span>\n\n\nMigrationWriter<span class=\"o\">.</span>register_serializer<span class=\"p\">(</span>Decimal<span class=\"p\">,</span> DecimalSerializer<span class=\"p\">)</span>\n</code></pre></div>\n<p>Det första argumentet i <code class=\"docutils literal notranslate\">MigrationWriter.register_serializer()</code> är en typ eller en iterabel av typer som ska använda serializer.</p>\n<p>Metoden <code class=\"docutils literal notranslate\">serialize()</code> i din serializer måste returnera en sträng som visar hur värdet ska visas i migreringar och en uppsättning av alla importer som behövs i migreringen.</p>\n</section>\n<section id=\"adding-a-deconstruct-method\">\n<span id=\"custom-deconstruct-method\"></span><h3>Lägga till en <code class=\"docutils literal notranslate\">deconstruct()</code>-metod<a class=\"heading-anchor\" href=\"#adding-a-deconstruct-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Du kan låta Django serialisera dina egna anpassade klassinstanser genom att ge klassen en <code class=\"docutils literal notranslate\">deconstruct()</code>-metod. Den tar inga argument och bör returnera en tupel av tre saker <code class=\"docutils literal notranslate\">(path, args, kwargs)</code>:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">path</code> bör vara Python-sökvägen till klassen, med klassnamnet inkluderat som sista del (t.ex. <code class=\"docutils literal notranslate\">myapp.custom_things.MyClass</code>). Om din klass inte är tillgänglig på den översta nivån i en modul är den inte serialiserbar.</p></li>\n<li><p><code class=\"docutils literal notranslate\">args</code> ska vara en lista med positionella argument som ska skickas till din klass <code class=\"docutils literal notranslate\">__init__</code> metod. Allt i denna lista bör i sig vara serialiserbart.</p></li>\n<li><p><code class=\"docutils literal notranslate\">kwargs</code> bör vara en dikt av nyckelordsargument att skicka till din klass <code class=\"docutils literal notranslate\">__init__</code> metod. Varje värde bör i sig vara serialiserbart.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Detta returvärde skiljer sig från metoden <code class=\"docutils literal notranslate\">deconstruct()</code> <a class=\"reference internal\" href=\"/sv/5.2/howto/custom-model-fields/#custom-field-deconstruct-method\"><span class=\"std std-ref\">for custom fields</span></a> som returnerar en tupel med fyra objekt.</p>\n</aside>\n<p>Django kommer att skriva ut värdet som en instansiering av din klass med de angivna argumenten, på samma sätt som det skriver ut referenser till Django-fält.</p>\n<p>För att förhindra att en ny migrering skapas varje gång <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> körs, bör du också lägga till en <code class=\"docutils literal notranslate\">__eq__()</code>-metod till den dekorerade klassen. Denna funktion kommer att anropas av Djangos migreringsramverk för att upptäcka förändringar mellan tillstånd.</p>\n<p>Så länge som alla argument till din klass konstruktör är själva serialiserbara, kan du använda <code class=\"docutils literal notranslate\">&#64;deconstructible</code> klassdekoratorn från <code class=\"docutils literal notranslate\">django.utils.deconstruct</code> för att lägga till <code class=\"docutils literal notranslate\">deconstruct()</code> metoden:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.deconstruct</span> <span class=\"kn\">import</span> deconstructible\n\n\n<span class=\"nd\">@deconstructible</span>\n<span class=\"k\">class</span> <span class=\"nc\">MyCustomClass</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> foo<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>foo <span class=\"o\">=</span> foo\n        <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__eq__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> other<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>foo <span class=\"o\">==</span> other<span class=\"o\">.</span>foo\n</code></pre></div>\n<p>Dekoratorn lägger till logik för att fånga upp och bevara argumenten på väg in i din konstruktor och returnerar sedan dessa argument exakt när deconstruct() anropas.</p>\n</section>\n</section>\n<section id=\"supporting-multiple-django-versions\">\n<h2>Stöd för flera Django-versioner<a class=\"heading-anchor\" href=\"#supporting-multiple-django-versions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Om du är underhållare av en tredjepartsapp med modeller kan du behöva skicka migreringar som stöder flera Django-versioner. I så fall bör du alltid köra <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> <strong>med den lägsta Django-versionen som du vill stödja</strong>.</p>\n<p>Migreringssystemet kommer att upprätthålla bakåtkompatibilitet enligt samma policy som resten av Django, så migreringsfiler som genererats på Django X.Y bör köras oförändrade på Django X.Y+1. Migreringssystemet lovar dock inte framåtkompatibilitet. Nya funktioner kan läggas till, och migreringsfiler som genereras med nyare versioner av Django kanske inte fungerar på äldre versioner.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Se även</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/\"><span class=\"doc\">Referensen för migreringsoperationer</span></a></dt><dd><p>Omfattar API:et för schemaoperationer, specialoperationer och att skriva egna operationer.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/sv/5.2/howto/writing-migrations/\"><span class=\"doc\">”Hur man skriver migreringar”</span></a></dt><dd><p>Förklarar hur man strukturerar och skriver databasmigreringar för olika scenarier som man kan stöta på.</p>\n</dd>\n</dl>\n</aside>\n</section>","rootId":"module-django.db.migrations","toc":[{"title":"Kommandon","anchor":"the-commands","children":[]},{"title":"Support för backend","anchor":"backend-support","children":[{"title":"PostgreSQL","anchor":"postgresql","children":[]},{"title":"MySQL","anchor":"mysql","children":[]},{"title":"SQLite","anchor":"sqlite","children":[]}]},{"title":"Arbetsflöde","anchor":"workflow","children":[{"title":"Versionskontroll","anchor":"version-control","children":[]}]},{"title":"Transaktioner","anchor":"transactions","children":[]},{"title":"Beroenden","anchor":"dependencies","children":[{"title":"Utbytbara beroenden","anchor":"swappable-dependencies","children":[]}]},{"title":"Migreringsfiler","anchor":"migration-files","children":[{"title":"Anpassade fält","anchor":"custom-fields","children":[]},{"title":"Modell chefer","anchor":"model-managers","children":[]},{"title":"Inledande migreringar","anchor":"initial-migrations","children":[]},{"title":"Historisk konsekvens","anchor":"history-consistency","children":[]}]},{"title":"Lägga till migreringar i appar","anchor":"adding-migrations-to-apps","children":[]},{"title":"Återvändande av migration","anchor":"reversing-migrations","children":[]},{"title":"Historiska modeller","anchor":"historical-models","children":[]},{"title":"Överväganden vid borttagning av modellfält","anchor":"considerations-when-removing-model-fields","children":[]},{"title":"Migrering av data","anchor":"data-migrations","children":[{"title":"Åtkomst till modeller från andra appar","anchor":"accessing-models-from-other-apps","children":[]},{"title":"Mer avancerade migreringar","anchor":"more-advanced-migrations","children":[]}]},{"title":"Minska antalet migreringar","anchor":"squashing-migrations","children":[]},{"title":"Serialisering av värden","anchor":"serializing-values","children":[{"title":"Anpassade serialiserare","anchor":"custom-serializers","children":[]},{"title":"Lägga till en deconstruct()-metod","anchor":"adding-a-deconstruct-method","children":[]}]},{"title":"Stöd för flera Django-versioner","anchor":"supporting-multiple-django-versions","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/5.2/topics/"}],"prev":{"docname":"topics/class-based-views/mixins","title":"Använda mixins med klassbaserade vyer","url":"/sv/5.2/topics/class-based-views/mixins/"},"next":{"docname":"topics/files","title":"Hantera filer","url":"/sv/5.2/topics/files/"},"formats":{"html":"/sv/5.2/topics/migrations/","markdown":"/sv/5.2/topics/migrations.md","json":"/sv/5.2/topics/migrations.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/migrations.txt","official":"https://docs.djangoproject.com/sv/5.2/topics/migrations/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}