Djangoのモデルに外部キー(FOREIGN KEY)を設定する

Djangoのモデルに外部キー(FOREIGN KEY)を設定する方法を解説します。

作業全体のイメージは以下のとおりです。

  1. Djangoプロジェクトのセットアップ
  2. モデルを作成する(ここで外部キーを設定)
  3. データベースにデータを登録する

Djangoプロジェクトのセットアップ

Djangoプロジェクトのセットアップを行います。

お決まりのパターンです。
詳細は下記の記事で解説しています。
pipenvを使ってDjangoプロジェクトを作成する

% mkdir easy_blog
% cd easy_blog
% pipenv install django==3.0.2
% pipenv shell
% django-admin startproject easy_blog_project .
% python manage.py startapp easy_blog
% python manage.py migrate
% python manage.py runserver

ここまでやると、ブラウザでDjangoプロジェクトが開けます。

次に、easy_blog_project/settings.pyを編集します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'easy_blog.apps.EasyBlogConfig', # 追記したもの
]

モデルを作成する

次にモデルを作成します。

from django.db import models


class User(models.Model):
  name = models.CharField(max_length=30)

  def __str__(self):
    return self.name

  
class Post(models.Model):
  title = models.CharField(max_length=200)
  author = models.ForeignKey(
    'User',
    on_delete=models.CASCADE
  )
  body = models.TextField()

  def __str__(self):
    return self.title

モデルを作成した後はマイグレーションを行います。
以下のコマンドを打ってください。

% python manage.py makemigrations easy_blog
% python manage.py migrate easy_blog
注意
マイグレーションせずに管理者でテーブルを見ようとすると、ブラウザに以下のようなエラーメッセージが表示されます。
OperationalError at /admin/easy_blog/user/
Exception Value:no such table: easy_blog_user
DjangoのORMを利用してデータベースのデータを表示する

管理者ユーザーを作成して、データを追加する

Djangoの管理者アカウントを作成します。

% python manage.py createsuperuser

easy_blog/admin.pyに管理者を登録します。
複数のモデルをadmin.pyに登録するためには、配列にモデルのクラスを格納します。

from django.contrib import admin
from .models import User, Post

# Register your models here.
myModels = [User, Post]
admin.site.register(myModels)

http://127.0.0.1:8000/admin/を開くと、管理者からテーブルを確認できます。

このテーブルにユーザーを追加しましょう。

Usersの横の「+Add」をクリックします。
フィールドに適当な名前(Name:)を入力して「SAVE」をクリックしましょう。

Postsテーブルに追加しようとすると、「Author」のテーブルに外部キーが張られているのがわかります。

先ほどの「User」テーブルに追加した名前以外は選択できないようになっているからです。

以上の作業で、モデルに外部キーを設定することができました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です