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動画教材を紹介します。