目的
- Djangoでの多対一の外部キー制約の記述方法の確認
- Django管理サイト上での外部キー制約の表示
前提
- Ubuntu 16.04
- Python 3.5.2
- Django 1.10.5
手順
外部キー制約の記述
Taskモデルオブジェクトの状態をStatusモデルで記述することを想定している。
(TaskモデルとStatusモデル間で多対一の関係を記述する)
モデルファイルの記述
statusモデルクラスは通常通り思うがまま記述する。
models/status.py
"""
Model for status
"""
from django.db import models
class Status(models.Model):
"""
Status for Task
"""
name = models.CharField('ステータス', max_length=30, blank=False)
taskクラス側で外部キー制約を記述する
models/task.py
from django.db import models
from datetime import datetime
from webui.models.status import Status
class Task(models.Model):
"""
Task to do.
"""
name = models.CharField('タスク名', max_length=30, blank=False)
startTime = models.DateTimeField('開始時刻', blank=True)
endTime = models.DateTimeField('終了時刻', blank=True, null=True)
memo = models.CharField('メモ', max_length=200, blank=True)
# status = models.CharField('状態', max_length=20, default='未着手', blank=False)
status = models.ForeignKey(Status)
status = models.ForeignKey(Status)
この部分でTaskモデルとStatusモデルの多対一の関係を記述している。
これで外部キー制約は記述完了
管理サイトでの表示
管理サイトに任意のフィールドを表示する方法は別途探してください。
(そのうち書く?)
初期状態
Taskのオブジェクトを設定してもstatusの項目が"Status object"となっていて悲しいのでこれを修正する。
修正方法(Statusモデルの修正)
models/status.py
from django.db import models
class Status(models.Model):
"""
Status for Task
"""
name = models.CharField('ステータス', max_length=30, blank=False)
def __str__(self):
return self.name
def __str__(self):
return self.name
この部分でどの情報を管理サイトの情報として表示するかを定義できる。
(_str_でオブジェクトが文字列として呼び出された時の表示内容を定義しているだけ??)
修正後
Statusモデルクラスを修正したことで、
Taskモデルのオブジェクトを管理サイトから表示した際に
期待した通りの表示を実現できている。