syakoo's Lab

技術ブログやちょっと気合の入った記事を残すブログ

数学を勉強するWebサイトの開発日記(6: データベースのリレーション)

はじめに

そこまで大きな事をするつもりはないです。ただの個人開発の勉強を含めたサービス作りの過程を残すブログです。

データベースのリレーション

前回はmodels.pyを使ってDefinitionsTheoremsのデータベースを作成したが、よくよく考えたら定義や定理にユーザー名の要素を追加していない。さすがにまずいので、今回はデータベースで管理している二つのモデルuserDefinitions(とTheorems)を関連付ける作業に入る。

使用する機能はこちら

class ForeignKey(to, on_delete, **options)

これを使ってリレーションを設定していく。toには対象のモデル(今回はUser)、on_deleteには対象のモデルが削除されたらどうするか(削除or残す)を渡す。変更後のmodels.pyはこんな感じ

models.py

from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from django.db import models

def set_anonymous_user():
    return get_user_model().objects.get_or_create(username='Anonymous')[0]


class Definition(models.Model):
    title = models.CharField('Title', max_length=255)
    file_name = models.CharField('File Name', max_length=63)
    user = models.ForeignKey(User, on_delete=models.SET(set_anonymous_user), null=True)
    created_at = models.DateTimeField('Created at', auto_now_add=True)

    def __str__(self):
        return self.title


class Theorem(models.Model):
    title = models.CharField('Title', max_length=255)
    file_name = models.CharField('File Name', max_length=63)
    user = models.ForeignKey(User, on_delete=models.SET(set_anonymous_user), null=True)
    created_at = models.DateTimeField('Created at', auto_now_add=True)

    def __str__(self):
        return self.title

DjangoにあらかじめあるUserモデルを対象として選択して、対象のUserが削除されたらAnonymousというユーザを割り当てるようにした。null=Tureはこの要素がnullでもOKかどうかを設定している。

動作確認の前に...

モデルを変更したら必ずしないといけないのがマイグレーション。モデルをデータベースに対応付けなければなりません。

$ python manage.py makemigrations
$ python manage.py migrate

動作確認

動作確認として、二つの動作を確認する。

  • userが登録されているか
  • userを削除するとAnonymousが割り当てられるか

確認していきましょう。まずはlocalhost:8000/admin/から適当なユーザー(test)を追加。

次にDefinitionsを開いて、Userの欄があることを確認したら先程追加したユーザーtestを選択。

f:id:syakoo:20190723203755p:plain

そして、testを削除すると...

f:id:syakoo:20190723203824p:plain

Anonymousがユーザーとして登録されていて、DefinitionsのユーザーがAnonymousに変更されていることが確認できた。

f:id:syakoo:20190723203915p:plain f:id:syakoo:20190723203941p:plain

最後にtemplatesにユーザーを表示するようにすると、そっちでもユーザーがAnonymousになっていることが確認できる。

f:id:syakoo:20190723204014p:plain

おわりに

実装時間よりブログにまとめる時間の方がかかった...