【django】 pk とは?

スポンサーリンク
Django

djangoでよく出てくる「pk」というワード。

djangoを学び始めた方は「pk?これなんだ?」と疑問に思われるかもしれません。
この「pk」はdjangoでデータベースを操作する上で非常に重要になってくるワードです。

今回はこの「pk」について書いていきます。

pkとは

まず簡単に説明すると

このpk」はプライマリーキー(primary key)の略です。

データベースの各データオブジェクトに付帯され、各データのユニークを表すキーです。

つまり、データベース上に複数あるデータオブジェクトを見分けが付くようにユニークキーをつけます。そのユニークキーがpk(プライマリーキー)です。

この「pk」はmodels.pyで設定しなくてもdjango上で自動的にIntegerFieldとして設定されます。
「pk」は自動的に設定される場合は、整数としてつけられるということです。

また、「pk」は自動的に設定されても、管理画面上では表に出てこないです。

その実例として、以下のようにmodels.pyをセットします。

from django.conf import settings
from django.db import models

class Sample(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()

これを管理者の画面で確認しても、models.pyで設定したフィールドのみが残ります。

前述通り、「pk」は表示されません。実際に管理者の画面として以下の画像で確認してみます。

「pk」に該当する部分は表示されてないです。内部的に持っているものになります。

pkは何に使われるのか

上記のように各データを識別するために使われます

また、先述どおり、models.pyにおいて定義したモデル内でどのフィールドに対しても、「primary_key=True」 が設定されなかった場合は、自動的にIntegerFieldを追加します。

djangoのversion 3.2以降ではIntegerFieldとは違い、AutoFieldが追加されます。
しかし、AutoFieldとIntegerFieldはほとんど同じで、整数が付与されます。

このAutoFieldやIntegerFieldがpkの役割を果たします。
(pkとなるフィールドは読み取り専用となり、操作することはできません。)

pkを使ったURLのパラメータ

今まで「pk」に関して説明していきましたが、実際「pk」が出てくる部分は限られてきます。
よくあるパターンとしてはURLにpkを使う場合です。

では、その実例として、実際に「pk」をURLのパラメータ使った例を書きます。

まず、models.pyです。

from django.conf import settings
from django.db import models

class Sample(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()

このあとには必ず makemigrations と migrate をします。

python manage.py makemigrations
python manage.py migrate

次に、urls.pyです。
ここで<int:pk>としてURLに「pk」が使われることを設定しておきます。

from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.lists, name='lists'),
    path('list/<int:pk>/', views.detail, name='detail'),
]

続いて、views.pyです。

def detailの引数として「pk」を使っています。
この「pk」が先ほどのURLとつながってきます。

from django.shortcuts import render, get_object_or_404
from .models import Sample

def lists(request):
    sample_list = Sample.objects.all()
    return render(request, 'lists.html', {'sample_list':sample_list})

def detail(request, pk):
    sample = get_object_or_404(Sample, pk=pk)
    return render(request, 'detail.html', {'sample': sample})

templateを2つ書きます。
views.py で表示する lists.html と detail.htmlです。

  <div>
      <h1>List Page</h1>
  </div>
  {% for sample in sample_list %}
      <div>
          <h4><a href="{% url 'detail' pk=sample.pk %}">{{ sample.title }}</a></h4>
          <p>{{ sample.text}}</p>
      </div>
  {% endfor %}
    <div>
      <h1>Detail Page</h1>
    </div>
    <div>
        <h2>{{ sample.title }}</h2>
        <p>{{ sample.text|linebreaksbr }}</p>
    </div>

以上です。

重要な部分はテンプレート上の”{% url ‘detail’ pk=sample.pk %}”の部分です。
pk = sample.pk の部分でURLパラメータでpkを引き渡し、pkの中身はsample.pkを渡します。

list部分の見た目はこんな感じになります。

detail部分はこんな感じです。

簡単な例ですが、以上です。

最後に

djangoをより学びたい場合の関連記事です。
djangoをレベル別で書籍を使用し、順序よく学びたい方におすすめの本を紹介している記事です。

djangoを初めて学ぶ初学の方から、基礎を学び終えた初級の方、アプリを作った・作っている中級の方の3種のレベルに分けておすすめの本を紹介しています。

また、動画で学びたい方はこちらの記事をおすすめします。
djangoをこれから学ぶ方から、アプリ開発したいけどやり方がわからない!って方におすすめです。
Udemyでおすすめな厳選django動画教材を紹介します。

タイトルとURLをコピーしました