【django】 pk とは?

Django

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

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

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

pkとは

まず簡単に説明すると

この”pk”はプライマリーキー(primary key)の略でデータベースの各データオブジェクトに付帯し、各データのユニークを表すキーです。

この”pk”はmodels.pyで設定しなくても自動的にIntegerFieldとして設定されます。
また、”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を追加します。
version 3.2以降ではIntegerFieldとは違い、AutoFieldが追加されます。
しかし、AutoFieldとIntegerFieldはほとんど同じです。

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

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

実際に”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です。

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

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 を学ぶ上で参考している本

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