{"title":"Sammansatta primärnycklar","version":"5.2","locale":"sv","docname":"topics/composite-primary-key","url":"/sv/5.2/topics/composite-primary-key/","canonical":"https://djangodocs.dev/sv/5.2/topics/composite-primary-key/","summary":"I Django har varje modell en primärnyckel. Som standard består denna primärnyckel av ett enda fält. I de flesta fall bör det räcka med en enda primärnyckel.","html":"<h1>Sammansatta primärnycklar<a class=\"heading-anchor\" href=\"#composite-primary-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>I Django har varje modell en primärnyckel. Som standard består denna primärnyckel av ett enda fält.</p>\n<p>I de flesta fall bör det räcka med en enda primärnyckel. Vid databasdesign är det dock ibland nödvändigt att definiera en primärnyckel som består av flera fält.</p>\n<p>För att använda en sammansatt primärnyckel måste du när du definierar en modell ange att attributet <code class=\"docutils literal notranslate\">pk</code> ska vara en <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.CompositePrimaryKey\" title=\"django.db.models.CompositePrimaryKey\"><code class=\"xref py py-class docutils literal notranslate\">CompositePrimaryKey</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Product</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Order</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    reference <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span> primary_key<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">OrderLineItem</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pk <span class=\"o\">=</span> models<span class=\"o\">.</span>CompositePrimaryKey<span class=\"p\">(</span><span class=\"s2\">&quot;product_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">)</span>\n    product <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Product<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    order <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Order<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    quantity <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n</code></pre></div>\n<p>Detta kommer att instruera Django att skapa en sammansatt primärnyckel (<code class=\"docutils literal notranslate\">PRIMARY KEY (product_id, order_id)</code>) när tabellen skapas.</p>\n<p>En sammansatt primärnyckel representeras av en <code class=\"docutils literal notranslate\">tupel</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>product <span class=\"o\">=</span> Product<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;apple&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>order <span class=\"o\">=</span> Order<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>reference<span class=\"o\">=</span><span class=\"s2\">&quot;A755H&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item <span class=\"o\">=</span> OrderLineItem<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>product<span class=\"o\">=</span>product<span class=\"p\">,</span> order<span class=\"o\">=</span>order<span class=\"p\">,</span> quantity<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>pk\n<span class=\"go\">(1, &quot;A755H&quot;)</span>\n</code></pre></div>\n<p>Du kan tilldela en <code class=\"docutils literal notranslate\">tuple</code> till attributet <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#django.db.models.Model.pk\" title=\"django.db.models.Model.pk\"><code class=\"xref py py-attr docutils literal notranslate\">pk</code></a>. Detta ställer in de associerade fältvärdena:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>item <span class=\"o\">=</span> OrderLineItem<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s2\">&quot;B142C&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>pk\n<span class=\"go\">(2, &quot;B142C&quot;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>product_id\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>order_id\n<span class=\"go\">&quot;B142C&quot;</span>\n</code></pre></div>\n<p>En sammansatt primärnyckel kan också filtreras med en <code class=\"docutils literal notranslate\">tupel</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItem<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;A755H&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>Vi arbetar fortfarande med stöd för sammansatta primärnycklar för <a class=\"reference internal\" href=\"#cpk-and-relations\"><span class=\"std std-ref\">relationsfält</span></a>, inklusive <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a>-fält, och Django-admin. Modeller med sammansatta primärnycklar kan för närvarande inte registreras i Django-admin. Du kan förvänta dig att se detta i framtida utgåvor.</p>\n<section id=\"migrating-to-a-composite-primary-key\">\n<h2>Migrera till en sammansatt primärnyckel<a class=\"heading-anchor\" href=\"#migrating-to-a-composite-primary-key\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django stöder inte migrering till eller från en sammansatt primärnyckel efter att tabellen har skapats. Det finns inte heller stöd för att lägga till eller ta bort fält från den sammansatta primärnyckeln.</p>\n<p>Om du vill migrera en befintlig tabell från en enda primärnyckel till en sammansatt primärnyckel ska du följa instruktionerna i din databasbackend för att göra det.</p>\n<p>När den sammansatta primärnyckeln är på plats lägger du till fältet <code class=\"docutils literal notranslate\">CompositePrimaryKey</code> i din modell. Detta gör att Django kan känna igen och hantera den sammansatta primära nyckeln på lämpligt sätt.</p>\n<p>Även om migreringsåtgärder (t.ex. <code class=\"docutils literal notranslate\">AddField</code>, <code class=\"docutils literal notranslate\">AlterField</code>) på primärnyckelfält inte stöds, kommer <code class=\"docutils literal notranslate\">makemigrations</code> ändå att upptäcka ändringar.</p>\n<p>För att undvika fel rekommenderas att sådana migreringar görs med <code class=\"docutils literal notranslate\">--fake</code>.</p>\n<p>Alternativt kan <a class=\"reference internal\" href=\"/sv/5.2/ref/migration-operations/#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\">SeparateDatabaseAndState</code></a> användas för att utföra backend-specifika migreringar och Django-genererade migreringar i en enda operation.</p>\n</section>\n<section id=\"composite-primary-keys-and-relations\">\n<span id=\"cpk-and-relations\"></span><h2>Sammansatta primärnycklar och relationer<a class=\"heading-anchor\" href=\"#composite-primary-keys-and-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#relationship-fields\"><span class=\"std std-ref\">Relationsfält</span></a>, inklusive <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/contenttypes/#generic-relations\"><span class=\"std std-ref\">generiska relationer</span></a> har inte stöd för sammansatta primärnycklar.</p>\n<p>Till exempel, med modellen <code class=\"docutils literal notranslate\">OrderLineItem</code> stöds inte följande:</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\">Foo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    item <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>OrderLineItem<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></div>\n<p>Eftersom <code class=\"docutils literal notranslate\">ForeignKey</code> för närvarande inte kan referera till modeller med sammansatta primärnycklar.</p>\n<p>För att komma runt denna begränsning kan <code class=\"docutils literal notranslate\">ForeignObject</code> användas som ett alternativ:</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\">Foo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    item_order_id <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    item_product_id <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    item <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignObject<span class=\"p\">(</span>\n        OrderLineItem<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        from_fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;item_order_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;item_product_id&quot;</span><span class=\"p\">),</span>\n        to_fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;product_id&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ForeignObject</code> är ungefär som <code class=\"docutils literal notranslate\">ForeignKey</code>, förutom att det inte skapar några kolumner (t.ex. <code class=\"docutils literal notranslate\">item_id</code>), främmande nyckelbegränsningar eller index i databasen, och argumentet <code class=\"docutils literal notranslate\">on_delete</code> ignoreras.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p><code class=\"docutils literal notranslate\">ForeignObject</code> är ett internt API. Detta innebär att det inte omfattas av vår <a class=\"reference internal\" href=\"/sv/5.2/internals/release-process/#internal-release-deprecation-policy\"><span class=\"std std-ref\">deprecation policy</span></a>.</p>\n</aside>\n</section>\n<section id=\"composite-primary-keys-and-database-functions\">\n<span id=\"cpk-and-database-functions\"></span><h2>Sammansatta primärnycklar och databasfunktioner<a class=\"heading-anchor\" href=\"#composite-primary-keys-and-database-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Många databasfunktioner accepterar bara ett enda uttryck.</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">MAX</span><span class=\"p\">(</span><span class=\"ss\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\">-- OK</span>\n<span class=\"k\">MAX</span><span class=\"p\">(</span><span class=\"ss\">&quot;product_id&quot;</span><span class=\"p\">,</span> <span class=\"ss\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\">-- ERROR</span>\n</code></pre></div>\n<p>I dessa fall ger en sammansatt primärnyckelreferens upphov till ett <code class=\"docutils literal notranslate\">ValueError</code>, eftersom den består av flera kolumnuttryck. Undantag görs för <code class=\"docutils literal notranslate\">Count</code>.</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>Max<span class=\"p\">(</span><span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OK</span>\nMax<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># ValueError</span>\nCount<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OK</span>\n</code></pre></div>\n</section>\n<section id=\"composite-primary-keys-in-forms\">\n<h2>Sammansatta primärnycklar i formulär<a class=\"heading-anchor\" href=\"#composite-primary-keys-in-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Eftersom en sammansatt primärnyckel är ett virtuellt fält, ett fält som inte representerar en enda databaskolumn, är detta fält uteslutet från ModelForms.</p>\n<p>Ta till exempel följande formulä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=\"k\">class</span> <span class=\"nc\">OrderLineItemForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> OrderLineItem\n        fields <span class=\"o\">=</span> <span class=\"s2\">&quot;__all__&quot;</span>\n</code></pre></div>\n<p>Det här formuläret har inte något formulärfält <code class=\"docutils literal notranslate\">pk</code> för den sammansatta primärnyckeln:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItemForm<span class=\"p\">()</span>\n<span class=\"go\">&lt;OrderLineItemForm bound=False, valid=Unknown, fields=(product;order;quantity)&gt;</span>\n</code></pre></div>\n<p>Om du anger det primära sammansatta fältet <code class=\"docutils literal notranslate\">pk</code> som ett formulärfält uppstår ett okänt fält <a class=\"reference internal\" href=\"/sv/5.2/ref/exceptions/#django.core.exceptions.FieldError\" title=\"django.core.exceptions.FieldError\"><code class=\"xref py py-exc docutils literal notranslate\">FieldError</code></a>.</p>\n<aside class=\"admonition-primary-key-fields-are-read-only admonition\" role=\"note\">\n<p class=\"admonition-title\">Primärnyckelfält är skrivskyddade</p>\n<p>Om du ändrar värdet på en primärnyckel i ett befintligt objekt och sedan sparar det, skapas ett nytt objekt vid sidan av det gamla (se <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">Field.primary_key</code></a>).</p>\n<p>Detta gäller även för sammansatta primärnycklar. Därför kan det vara bra att ställa in <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">Field.editable</code></a> till <code class=\"docutils literal notranslate\">False</code> på alla primärnyckelfält för att utesluta dem från ModelForms.</p>\n</aside>\n</section>\n<section id=\"composite-primary-keys-in-model-validation\">\n<h2>Sammansatta primärnycklar i modellvalidering<a class=\"heading-anchor\" href=\"#composite-primary-keys-in-model-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Eftersom <code class=\"docutils literal notranslate\">pk</code> bara är ett virtuellt fält har det ingen effekt att inkludera <code class=\"docutils literal notranslate\">pk</code> som ett fältnamn i argumentet <code class=\"docutils literal notranslate\">exclude</code> i <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\">Model.clean_fields()</code></a>. För att utesluta de sammansatta primärnyckelfälten från <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">modellvalidering</span></a>, ange varje fält individuellt. <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#django.db.models.Model.validate_unique\" title=\"django.db.models.Model.validate_unique\"><code class=\"xref py py-meth docutils literal notranslate\">Model.validate_unique()</code></a> kan fortfarande anropas med <code class=\"docutils literal notranslate\">exclude={&quot;pk&quot;}</code> för att hoppa över unikhetskontroller.</p>\n</section>\n<section id=\"building-composite-primary-key-ready-applications\">\n<h2>Bygga färdiga applikationer med sammansatt primärnyckel<a class=\"heading-anchor\" href=\"#building-composite-primary-key-ready-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Före införandet av sammansatta primärnycklar kunde det enskilda fält som utgjorde primärnyckeln för en modell hämtas genom introspektion av attributet <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">primary key</code></a> för dess fält:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>pk_field <span class=\"o\">=</span> <span class=\"kc\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> field <span class=\"ow\">in</span> Product<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> field<span class=\"o\">.</span>primary_key<span class=\"p\">:</span>\n<span class=\"gp\">... </span>        pk_field <span class=\"o\">=</span> field\n<span class=\"gp\">... </span>        <span class=\"k\">break</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pk_field\n<span class=\"go\">&lt;django.db.models.fields.AutoField: id&gt;</span>\n</code></pre></div>\n<p>Nu när en primärnyckel kan bestå av flera fält kan attributet <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">primary key</code></a> inte längre användas för att identifiera medlemmar av primärnyckeln eftersom det kommer att sättas till <code class=\"docutils literal notranslate\">False</code> för att upprätthålla invariansen att högst ett fält per modell kommer att ha detta attribut satt till <code class=\"docutils literal notranslate\">True</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>pk_fields <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> field <span class=\"ow\">in</span> OrderLineItem<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> field<span class=\"o\">.</span>primary_key<span class=\"p\">:</span>\n<span class=\"gp\">... </span>        pk_fields<span class=\"o\">.</span>append<span class=\"p\">(</span>field<span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pk_fields\n<span class=\"go\">[]</span>\n</code></pre></div>\n<p>För att bygga applikationskod som korrekt hanterar sammansatta primärnycklar bör attributet <a class=\"reference internal\" href=\"/sv/5.2/ref/models/meta/#django.db.models.options.Options.pk_fields\" title=\"django.db.models.options.Options.pk_fields\"><code class=\"xref py py-attr docutils literal notranslate\">_meta.pk_fields</code></a> användas istället:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Product<span class=\"o\">.</span>_meta<span class=\"o\">.</span>pk_fields\n<span class=\"go\">[&lt;django.db.models.fields.AutoField: id&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItem<span class=\"o\">.</span>_meta<span class=\"o\">.</span>pk_fields\n<span class=\"go\">[</span>\n<span class=\"go\">    &lt;django.db.models.fields.ForeignKey: product&gt;,</span>\n<span class=\"go\">    &lt;django.db.models.fields.ForeignKey: order&gt;</span>\n<span class=\"go\">]</span>\n</code></pre></div>\n</section>","rootId":"composite-primary-keys","toc":[{"title":"Migrera till en sammansatt primärnyckel","anchor":"migrating-to-a-composite-primary-key","children":[]},{"title":"Sammansatta primärnycklar och relationer","anchor":"composite-primary-keys-and-relations","children":[]},{"title":"Sammansatta primärnycklar och databasfunktioner","anchor":"composite-primary-keys-and-database-functions","children":[]},{"title":"Sammansatta primärnycklar i formulär","anchor":"composite-primary-keys-in-forms","children":[]},{"title":"Sammansatta primärnycklar i modellvalidering","anchor":"composite-primary-keys-in-model-validation","children":[]},{"title":"Bygga färdiga applikationer med sammansatt primärnyckel","anchor":"building-composite-primary-key-ready-applications","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/5.2/topics/"}],"prev":{"docname":"topics/conditional-view-processing","title":"Behandling av villkorlig vy","url":"/sv/5.2/topics/conditional-view-processing/"},"next":{"docname":"topics/signing","title":"Kryptografisk signering","url":"/sv/5.2/topics/signing/"},"formats":{"html":"/sv/5.2/topics/composite-primary-key/","markdown":"/sv/5.2/topics/composite-primary-key.md","json":"/sv/5.2/topics/composite-primary-key.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/composite-primary-key.txt","official":"https://docs.djangoproject.com/sv/5.2/topics/composite-primary-key/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}