LoginSignup
12
13

More than 5 years have passed since last update.

Djangoで外部キー制約を記述する

Posted at

目的

  • 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モデルの多対一の関係を記述している。
これで外部キー制約は記述完了

管理サイトでの表示

管理サイトに任意のフィールドを表示する方法は別途探してください。
(そのうち書く?)

初期状態

image

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モデルのオブジェクトを管理サイトから表示した際に
期待した通りの表示を実現できている。

image

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13