{"title":"Sammansatta primärnycklar","version":"6.0","locale":"sv","docname":"topics/composite-primary-key","url":"/sv/6.0/topics/composite-primary-key/","canonical":"https://djangodocs.dev/sv/6.0/topics/composite-primary-key/","summary":"New in Django 5.2 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…","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\">\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\"><span class=\"pre\">pk</span></code> ska vara en <a class=\"reference internal\" href=\"/sv/6.0/ref/models/fields/#django.db.models.CompositePrimaryKey\" title=\"django.db.models.CompositePrimaryKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CompositePrimaryKey</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Product</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Order</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">reference</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span> <span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OrderLineItem</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pk</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CompositePrimaryKey</span><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    <span class=\"n\">product</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Product</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">order</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Order</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">quantity</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><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\"><span class=\"pre\">PRIMARY</span> <span class=\"pre\">KEY</span> <span class=\"pre\">(product_id,</span> <span class=\"pre\">order_id)</span></code>) när tabellen skapas.</p>\n<p>En sammansatt primärnyckel representeras av en <code class=\"docutils literal notranslate\"><span class=\"pre\">tupel</span></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><span class=\"n\">product</span> <span class=\"o\">=</span> <span class=\"n\">Product</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;apple&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">order</span> <span class=\"o\">=</span> <span class=\"n\">Order</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">reference</span><span class=\"o\">=</span><span class=\"s2\">&quot;A755H&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">item</span> <span class=\"o\">=</span> <span class=\"n\">OrderLineItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">product</span><span class=\"o\">=</span><span class=\"n\">product</span><span class=\"p\">,</span> <span class=\"n\">order</span><span class=\"o\">=</span><span class=\"n\">order</span><span class=\"p\">,</span> <span class=\"n\">quantity</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">pk</span>\n<span class=\"go\">(1, &quot;A755H&quot;)</span>\n</code></pre></div>\n<p>Du kan tilldela en <code class=\"docutils literal notranslate\"><span class=\"pre\">tuple</span></code> till attributet <a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.pk\" title=\"django.db.models.Model.pk\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">pk</span></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><span class=\"n\">item</span> <span class=\"o\">=</span> <span class=\"n\">OrderLineItem</span><span class=\"p\">(</span><span class=\"n\">pk</span><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><span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">pk</span>\n<span class=\"go\">(2, &quot;B142C&quot;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">product_id</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">order_id</span>\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\"><span class=\"pre\">tupel</span></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><span class=\"n\">OrderLineItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pk</span><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><span class=\"n\">count</span><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/6.0/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a>-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\"><span class=\"pre\">CompositePrimaryKey</span></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\"><span class=\"pre\">AddField</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code>) på primärnyckelfält inte stöds, kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></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\"><span class=\"pre\">--fake</span></code>.</p>\n<p>Alternativt kan <a class=\"reference internal\" href=\"/sv/6.0/ref/migration-operations/#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code></a> 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/6.0/ref/models/fields/#relationship-fields\"><span class=\"std std-ref\">Relationsfält</span></a>, inklusive <a class=\"reference internal\" href=\"/sv/6.0/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\"><span class=\"pre\">OrderLineItem</span></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=\"w\"> </span><span class=\"nc\">Foo</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">item</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">OrderLineItem</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></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\"><span class=\"pre\">ForeignObject</span></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=\"w\"> </span><span class=\"nc\">Foo</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">item_order_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">item_product_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">item</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignObject</span><span class=\"p\">(</span>\n        <span class=\"n\">OrderLineItem</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">from_fields</span><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        <span class=\"n\">to_fields</span><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\"><span class=\"pre\">ForeignObject</span></code> är ungefär som <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code>, förutom att det inte skapar några kolumner (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">item_id</span></code>), främmande nyckelbegränsningar eller index i databasen, och argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">on_delete</span></code> ignoreras.</p>\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=\"w\">  </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=\"w\"> </span><span class=\"ss\">&quot;order_id&quot;</span><span class=\"p\">)</span><span class=\"w\">  </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\"><span class=\"pre\">ValueError</span></code>, eftersom den består av flera kolumnuttryck. Undantag görs för <code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></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><span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OK</span>\n<span class=\"n\">Max</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># ValueError</span>\n<span class=\"n\">Count</span><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=\"w\"> </span><span class=\"nc\">OrderLineItemForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">OrderLineItem</span>\n        <span class=\"n\">fields</span> <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\"><span class=\"pre\">pk</span></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><span class=\"n\">OrderLineItemForm</span><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\"><span class=\"pre\">pk</span></code> som ett formulärfält uppstår ett okänt fält <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.core.exceptions.FieldError\" title=\"django.core.exceptions.FieldError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">FieldError</span></code></a>.</p>\n<aside class=\"admonition-primary-key-fields-are-read-only admonition\">\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/6.0/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\"><span class=\"pre\">Field.primary_key</span></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/6.0/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.editable</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></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\"><span class=\"pre\">pk</span></code> bara är ett virtuellt fält har det ingen effekt att inkludera <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> som ett fältnamn i argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> i <a class=\"reference internal\" href=\"/sv/6.0/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\"><span class=\"pre\">Model.clean_fields()</span></code></a>. För att utesluta de sammansatta primärnyckelfälten från <a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">modellvalidering</span></a>, ange varje fält individuellt. <a class=\"reference internal\" href=\"/sv/6.0/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\"><span class=\"pre\">Model.validate_unique()</span></code></a> kan fortfarande anropas med <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude={&quot;pk&quot;}</span></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/6.0/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\"><span class=\"pre\">primary</span> <span class=\"pre\">key</span></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><span class=\"n\">pk_field</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">field</span> <span class=\"ow\">in</span> <span class=\"n\">Product</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">primary_key</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">pk_field</span> <span class=\"o\">=</span> <span class=\"n\">field</span>\n<span class=\"gp\">... </span>        <span class=\"k\">break</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pk_field</span>\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/6.0/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\"><span class=\"pre\">primary</span> <span class=\"pre\">key</span></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\"><span class=\"pre\">False</span></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\"><span class=\"pre\">True</span></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><span class=\"n\">pk_fields</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">field</span> <span class=\"ow\">in</span> <span class=\"n\">OrderLineItem</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">get_fields</span><span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">primary_key</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">pk_fields</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">field</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pk_fields</span>\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/6.0/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\"><span class=\"pre\">_meta.pk_fields</span></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><span class=\"n\">Product</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">pk_fields</span>\n<span class=\"go\">[&lt;django.db.models.fields.AutoField: id&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">OrderLineItem</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">pk_fields</span>\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/6.0/topics/"}],"prev":{"docname":"topics/conditional-view-processing","title":"Behandling av villkorlig vy","url":"/sv/6.0/topics/conditional-view-processing/"},"next":{"docname":"topics/signing","title":"Kryptografisk signering","url":"/sv/6.0/topics/signing/"},"formats":{"html":"/sv/6.0/topics/composite-primary-key/","markdown":"/sv/6.0/topics/composite-primary-key.md","json":"/sv/6.0/topics/composite-primary-key.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/composite-primary-key.txt","official":"https://docs.djangoproject.com/sv/6.0/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"]}