Djangoのモデルに外部キー(FOREIGN KEY)を設定する方法を解説します。
作業全体のイメージは以下のとおりです。
[list class=”ol-circle li-accentbdr acc-bc-before”]
- Djangoプロジェクトのセットアップ
- モデルを作成する(ここで外部キーを設定)
- データベースにデータを登録する
[/list]
Djangoプロジェクトのセットアップ
Djangoプロジェクトのセットアップを行います。
お決まりのパターンです。
詳細は下記の記事で解説しています。
[kanren id=”51″ target=”_blank” rel=”noopener noreferrer”]
% 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
[alert title=”注意”]マイグレーションせずに管理者でテーブルを見ようとすると、ブラウザに以下のようなエラーメッセージが表示されます。
OperationalError at /admin/easy_blog/user/
Exception Value:no such table: easy_blog_user[/alert]
[kanren id=”127″ target=”_blank” rel=”noopener noreferrer”]
管理者ユーザーを作成して、データを追加する
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」テーブルに追加した名前以外は選択できないようになっているからです。

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